【发布时间】:2016-04-06 07:10:50
【问题描述】:
在考虑数据库规范化规则时首选哪种表设计:
考虑以下用于描述有序树的节点表的设计。键是复合键。
- ck:复合键
- parent:父节点
- next:下一个节点,其中
next.parent = parent.
(这定义了一个前向链表) - sk:代理键
设计1:
node(ck_x, ck_y, parent_ck_x, parent_ck_y, next_ck_x, next_ck_y)
设计2:
node(sk, ck_x, ck_y, parent_ck_x, parent_ck_y, next_ck_x, next_ck_y)
设计 3:
node(sk, ck_x, ck_y, parent_sk, next_sk)
第一个设计有 6 列。第二种设计增加了一个替代键,有 7 个列。第三种设计有 5 个列,它使用代理项来保存一列。
是否有任何规范化规则(或其他数据库设计规则)偏好一种设计而不是其他设计?
更新
替代设计:子类型节点表、isParent 标志、嵌套集。这些设计具有更大的读/写复杂性。
设计 4:
-
此设计将表拆分为 3 个表。父表和下一个表包含来自节点表的键的互斥子集。它为每个节点使用
2+4=6列。node(ck_x, ck_y)parent(ck_x, ck_y, parent_ck_x, parent_ck_y)next(ck_x, ck_y, next_ck_x, next_ck_y)
设计 5:
-
此设计使用 isParent 标志来指示下一项是父项。它使用
4+1=5列,1 列只是一点点。这比设计 3) 中使用的 5 列空间小node(ck_x, ck_y, next_ck_x, next_ck_y, isParent)
设计 6:
-
此设计使用嵌套集来创建有序树。复合键不再用于定义父级或子级的顺序。它使用
2+2=4列。但是下限列和上限列都应该使用sizeof(ck_x)+sizeof(ck_y),这等于设计1中使用的6列的空间。node(ck_x, ck_y, lowerBound, upperBound)
更新
设计 7:
-
这使用索引来表示节点的位置。
node(ck_x, ck_y, parent_ck_x, parent_ck_y, index)
备注
使用前一个节点 i.s.o.与插入和更新相比,下一个节点减少了对单个插入的创建和添加。
规范化与列或表的数量无关。
【问题讨论】:
-
请为每个表提供一个由列名参数化的语句,其中的一行表示树。
-
通常您不想将链表嵌入到关系设计中。存储顺序的首选方法是分配一个 ordering-key,其值指示组内兄弟姐妹的顺序。虽然这确实需要将键重新分配给组内的所有兄弟姐妹,但考虑到关系查询的实际工作方式,这更可取。
-
谢谢。问题是当使用 next 时,父信息有点重复,因为我们已经知道第一个兄弟的父信息。使用序数位置删除此重复项,因为除了通过父项之外无法找到兄弟姐妹。我担心的是,使用下一个指针这在某种程度上不符合规范化形式(指导线)。使用序数可以解决这个问题,但它不能回答我的问题。给定一个使用下一个指针的数据库?是否符合 1 2 3 4 5 6 NF?是否有任何使用下一个指针违反的设计指南。设计 6 有点类似。
标签: database database-normalization composite-key surrogate-key