如何在Datomic中实现排序到多个关系?

Ste*_*zen 5 clojure database-schema datomic

Datomic中没有开箱即用的架构功能,用于在多对多关系中对子实体进行排序,但这是一个非常常见的要求.谷歌搜索已经发现了一些解决方案,所以我想在这里列出需求和解决方案的变化,并希望得到社区的评论.

可能的要求

  • R1:小数(N)子实体(不确定小/大阈值应该是什么)
  • R2:大量子实体
  • R3:单亲儿童
  • R4:多亲子女
  • R5:递归子节点,即存储在Datomic中的树

我的特定用例是R1 + R3 + R5,我怀疑它很常见,但我希望尽可能多地枚举,以便将来可能成为其他人的有用参考.

解决方案

问题

每个解决方案似乎都有挑战.我能想到的是:

  • P1:保持插入,删除或移动操作的恒定时间操作.已经建议对"位置"值使用小数来避免在重新排序时更新所有子项
  • P2:通过订购支持多个父母关系
  • P3:维护存储订单的位置或边缘的复杂性,如订单或成员资格更改.
  • P4:更改为"position"属性会影响子实体未实际更改时隐含的"上次更改"日期
  • P5:通过包装器实体连接时,查询/拉取(特别是递归查询)会变得很困难

对于我的树用例,我不关心P2和P1不是一个大问题,因为N通常很低

所有这些研究都没有帮助我找到清楚哪种解决方案最适合我的树用例,但我倾向于S2.当然,最不复杂的是我的目标,但我怀疑所有解决方案都很复杂.

问题:您对此问题有什么经验吗?您可以分享哪些内容可以帮助其他人做出决定?我们会在指出时添加更多R,S和P.我(和许多其他人)将非常感谢任何反馈.

一个类似的问题在几年前询问,但没有多少那里发生.

Ste*_*zen 0

为了将来的参考,我通过使用带拉链的 Datomic 链接列表包装器,成功满足了我的要求(有序树存储) 。链接列表代码有几个错误,我将很快将它们分叉/修复/部署到 clojars。

该解决方案非常简单,并且具有恒定的更改操作时间,因此性能良好。

一项挑战是多重有序的子关系。链表代码假定每个实体有一个有序列表,在我的例子中,我需要 1 个用于树子级的列表,但需要更多用于其他数据的列表。我已经解决了这个问题,但如果您的要求类似,则需要考虑这一点。

如果此原型中出现其他有用的观察结果,我将发表进一步的评论。