假设我有一个ID TEXT PRIMARY KEY
列,这个ID
用于在插入数据时为该行创建PATH LTREE
列。因此ID
最终成为路径中的最后一个标签。
那么,既然LTREE
路径已经将ID作为最后一个标签,那么就完全去掉ID列是个明智的主意吗?PATH LTREE
可以作为主键吗?
这种做法有什么害处吗?
假设我有一个ID TEXT PRIMARY KEY
列,这个ID
用于在插入数据时为该行创建PATH LTREE
列。因此ID
最终成为路径中的最后一个标签。
那么,既然LTREE
路径已经将ID作为最后一个标签,那么就完全去掉ID列是个明智的主意吗?PATH LTREE
可以作为主键吗?
这种做法有什么害处吗?
1条答案
按热度按时间fnatzsnv1#
如果您查看
ltree
模块文档中的示例:您可以看到有两个条目的叶值为“Astronomy”。
如果您的ID总是用作最后一个标签,则在这种情况下它可能会有重复项(因此不再具有主键约束)。
您可以在最后一个标签上使用唯一索引来复制唯一性约束:
但是,您将无法从此索引创建主键,因为它依赖于表达式。
我想这完全取决于您如何维护ID和ltree值之间的一致性。
可能值得保留
ID
列作为主键,并自动计算其值(例如通过触发器),无论何时插入和更新ltree
值,都使用subpath(..., -1, 1)
,或者至少有某种形式的约束来确保它与路径一致。这也取决于您对row locks的处理。
特别是,
subpath(test.path, -1, 1)
上的唯一索引不会完全复制主键索引的行为: