5

我正在尝试使用此处描述的物化路径模型来实现树状结构:http ://www.dbazine.com/oracle/or-articles/tropashko4 。

是否可以在 [path] 字段上强制执行参照完整性?我不知道 SQL 是如何做到的,我必须在 DAL 中手动完成吗?

4

4 回答 4

3

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

邻接表支持参照完整性,我称之为“闭包表”的设计也是如此(Tropashko 称这种设计为“传递闭包关系”)。

于 2009-08-07T05:36:40.903 回答
3

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

“物化路径”只不过是传递闭包上的“某种形式的物化视图”,因此与任何其他“物化视图”都存在完全相同的问题,除了由于涉及闭包而在算法上更糟糕.

当闭包约束起作用时,SQL 几乎完全无能为力。(意思是:是的,SQL 要求你自己做所有事情。)这是 RM 发挥其几乎无限能力的最大能力的领域之一,但 SQL 失败得很厉害,而且大多数人都误会 SQL 真是太可惜了因为是有关系的。

(@Bill Karwin:对于您对树的深度与性能结果之间的关系的评论,我希望能够给您 +1。没有已知的算法可以计算在以下情况下表现良好的闭包具有“疯狂”深度的树。这是一个算法问题,不是 SQL 也不是关系问题。)

编辑

是的,RM = 关系模型

于 2009-08-07T20:20:41.353 回答
1

在物化路径模型中,您可以使用任意字符串(可能是允许超过 256 个子项的 unicode 字符串)而不是“xyz”形式的特殊字符串。然后,父级的 id 就是删除了最后一个字符的直接子级的 id 。您可以使用检查约束轻松执行此操作(我的示例适用于 PostgreSQL)

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

在您的创建表命令中。如果您坚持使用“xyz”形式的字符串,您将不得不使用正则表达式,但我猜有可能找到相应的检查约束。

于 2009-08-07T12:05:01.447 回答
-1

是的,我们可以“在 [path] 字段上强制引用完整性”。几年前我这样做了,在这里描述:

将配置设置作为层次结构存储在数据库中

于 2010-03-03T21:55:09.363 回答