首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库设计:分层数据

数据库设计:分层数据
EN

Stack Overflow用户
提问于 2012-03-09 18:41:07
回答 2查看 1.4K关注 0票数 0

我很难找到一个规范化的关系数据库设计来描述一个小层次结构,这个层次结构与典型的层次结构示例有很大的偏差,以至于我不知道如何继续我的第一次处理这样的问题。

我的问题如下:

保证层次结构中的每个分支具有2、4或6层深度。如果是2层深度,则层次结构如下所示:

代码语言:javascript
复制
Category / Group / Component

如果它是4层深,它看起来如下:

代码语言:javascript
复制
Category / Group / Component / Group / Component

如果它是6层深,它看起来如下:

代码语言:javascript
复制
Category / Group / Component / Group / Component / Group / Component

类别、组和组件都有自己的属性集。更复杂的是,组件与实体A、组件与实体B、组件与实体C之间存在着一种关系。

我最初的想法是努力将组件保存在一个表中,但是,我一直无法找到满足这个目标的规范化解决方案。

相反,我想出了一个规范化的解决方案,在这三个可能的组件级别上都有一个单独的组件表。但是,我对此并不满意,因为它将捕获组件与实体A、B和C之间链接的表数量增加了两倍(9个总链接表,而不是3个如果所有组件都在一个表中)。

我想出的设计是这样的:

代码语言:javascript
复制
TABLE: Group_1_Components

ATTRIBUTES: Row_ID, Category, Component

RELATES-TO: Group_1_Components_A_Links, Group_1_Components_B_Links, Group_1_Components_C_Links, Group_2_Components

代码语言:javascript
复制
TABLE: Group_2_Components

ATTRIBUTES: Row_ID, Group, Component, Group_1_Component_Row_ID

RELATES-TO: Group_2_Components_A_Links, Group_2_Components_B_Links, Group_2_Components_C_Links, Group_1_Components, Group_3_Components

代码语言:javascript
复制
TABLE: Group_3_Components

ATTRIBUTES: Row_ID, Group, Component, Group_2_Component_Row_ID

RELATES-TO: Group_3_Components_A_Links, Group_3_Components_B_Links, Group_3_Components_C_Links, Group_2_Components

9个链接表中的每一个都包含两个行ID,以解决与表A、表B或表C的多到多关系。

这是一个合理的设计,还是我忽略了一个更简单、更典型的解决方案?我看了一些特定于在关系数据库中捕获层次结构的设计技术,尤其是邻接列表,但我不确定它们是否适合这里,它们似乎也不是规范化的解决方案。

应该注意的是,层次结构将被很少修改;它将经常被读取,其中读取所选组的所有组件或特定级别的组件。与实体A、B和C的链接表将定期写入。

欢迎任何和所有建议。提前谢谢你的帮助。布赖恩

EN

回答 2

Stack Overflow用户

发布于 2012-03-24 10:02:07

我建议您去规范化您的数据,以便您的层次结构是基于组件/组实体,以便您匹配“常规”层次结构。在这种情况下,您可以有以下表:

( a)组成部分

( b)团体

c) Component_Groups --在component_id和group_id上使用唯一的键,以确保每个组件和组只有一个组合

在本例中,您的层次结构将是:类别-> Component_Group -> Component_Group -> Component_Group

票数 1
EN

Stack Overflow用户

发布于 2014-04-27 04:12:26

这类问题的另一个选择是使用自引用表。只有一张桌子。

具有ID、PARENT_ID和类型的单个表,以便区分类别、组和组件。

所有类别都没有PARENT_ID,然后可以搜索父id等于要深入研究的类别的id的所有子对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9639297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档