2009-08-07 72 views

回答

3

是的,当您对分层数据使用实体化路径或嵌套集解决方案时,您必须自己在DAL中执行数据完整性。

邻接列表支持引用完整性,对于我称之为“Closure Table”(Tropashko称此设计为“传递闭包关系”)的设计也是如此。

+0

感谢您的信息,比尔。 – hyperslug 2009-08-07 08:38:17

+0

这里是关于传递闭包解决方案的文章:http://www.codeproject.com/KB/database/Modeling_DAGs_on_SQL_DBs.aspx @Bill Karwin:你在OLTP /交互式场景中使用“闭合表”部署了多大数据集而没有达到性能插入问题? – nawroth 2009-08-07 11:59:31

+0

@nawroth:只有树上数千个节点的顺序,这么好。如果你需要表现很深的树木,你会得到很多行。如果你需要代表许多浅层树木,那就更加谦虚。 – 2009-08-07 14:32:52

1

在物化路径模型中,您可以使用任意字符串(也许unicode字符串以允许超过256个子元素)而不是形式为“x.y.z”的特殊字符串。父母的ID是直接子女的ID,最后一个字符被删除。您可以轻松地检查约束强制执行这个喜欢(我的例子中的PostgreSQL作品)

check(parent_id = substring(id from 1 for char_length(id)-1)), 

你create table命令中。如果你坚持使用“x.y.z”形式的字符串,你将不得不使用正则表达式,但我猜想可能找到相应的检查约束。

+0

如果您想强制根具有char_length(id)= 1,那么您可以额外将约束检查((parent_id为null)或(char_length(id)= 1))添加到表定义中。 – Whoever 2009-08-07 12:08:53

3

Vadim Tropashko在该文章中提出的“物化路径”,将秩序的概念引入到关系中(“琼斯是第二个成员”)。

“物化路径”仅仅是传递闭包的“某种形式的物化视图”,因此会遭受与任何其他“物化视图”完全相同的问题,除了事物在算法上由于参与封闭。

当封闭约束发挥作用时,SQL几乎完全无能为力。 (意思是说,SQL要求你自己做所有事情。)这是RM显示其几乎无限制的最大功能的领域之一,但是SQL失败了,而且大多数人误认为这是一种耻辱为关系。

(@Bill Karwin:我希望能够给你+1关于树深度和性能结果之间的关系的评论。没有已知的算法来计算性能良好的闭包在用“疯狂”深度树木的情况。这是一个算法的问题,而不是一个SQL也不是关系之一。)

编辑

是,RM =关系模型

+0

RM =关系模型? – hyperslug 2009-08-07 21:17:52

+1

+1是的,物化路径是非规范化的一个例子。它对某些类型的查询有一定的效率优势,但它会牺牲RM的好处,例如引用完整性。 – 2009-08-07 21:43:46

+0

顺便说一句,你可以将鼠标悬停在评论左侧的不可见的upvote箭头上,并给予评论一点支持。不过,这并不代表重要的意义。 – 2009-08-07 21:44:44