尽管 SQL 更依赖于类似表的操作而不是递归,但假设我们想要实现链接(或双链接)列表概念(就像我们在 C 中的例子)。
考虑到我们可以让项目从任何地方移动到链表上的任何地方,有没有办法有效地做到这一点?
使用 CLR 的一些解决方案?
或者它真的不应该被带到 SQL Server 中?
请注意,这个问题也演变成了链表 VS 树的讨论
虽然我固定了 SQL Server,但这是一个学术性的问题,因此任何其他解决方案也很好,即使我们得出的结论是,这是永远不应该被带到数据库中的东西。
链表只是一个非常简单的有向无环图。没有理由为什么这在任何方面都很困难,或者对于 sql server 应该避免。
想想看,树结构比链表更复杂。互联网上将数据存储在关系数据库中的论坛的每个实现都实现了链接列表的基础知识。在这个页面上,答案形成一个链接列表。可以添加和删除它们。它们可以移动到位(也就是按投票排名)。
要使用的特定表示仅取决于您希望在维护列表(插入、更新、删除)和检索之间进行的权衡。
--Works great for INS/UPD/DEL, In order retrieval isn't the best.
CREATE TABLE Item (id int identity, next int, prev int)
--makes in order retrieval fast, deletes are a problem, inserts may require re-numbering.
CREATE TABLE Item (id int identity, position int)
--Works great for in-order retrieval, and allow cheap insertion/deletion,
--certain edge cases might be tricky to handle.
CREATE TABLE Item (id int identity, position Decimal(24,12))
--for inserts, use the average of the before and after, for deletes, just delete.
Run Code Online (Sandbox Code Playgroud)
更新:问题是关于 SQL Server 中的树与链表
SQL Server 具有HierarchyId 数据类型,旨在简化树状结构的实现和查询。
CREATE TABLE Item (id int identity, NodeId HierarchyId)
Run Code Online (Sandbox Code Playgroud)