考虑数据库规范化规则时首选哪种表设计:
考虑描述有序树的节点表的以下设计。密钥是复合密钥。
- ck:复合键
- parent:父节点
- next:下一个节点,其中
next.parent = parent.
(这定义了一个前向链表) - sk:代理键
设计一:
node(ck_x, ck_y, parent_ck_x, parent_ck_y, next_ck_x, next_ck_y)
设计二:
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)
笔记
与插入和更新相比,使用前一个节点 iso 下一个节点减少了对单个插入的创建和添加。
规范化与列或表的数量无关。