Datomic中没有现成的模式特性用于在多对多关系中对子实体进行排序,但这是一个非常普遍的要求。谷歌搜索已经发现了一些解决方案,所以我想在此清点各种需求和解决方案,并希望得到社区的意见。如何在Datomic中实现排序的一对多关系?
可能要求
- R1:少数孩子的实体(N)(不知道的小/大 门槛应该是什么)
- R2:大量子实体的
- R3:单亲儿童
- R4:多父母子女
- R5:递归子女,即存储在Datomic中的树
我的特殊使用案例是R1 + R3 + R5,我认为这很常见,但我想尽可能多地列举,以便将来可以成为其他人的有用参考。
解
- S1:带有 “位置” 嵌套组件的实体属性例如Datofu
- S2:添加自定义“位置”属性,每一个孩子的描述using transactor fns here和this post
- S3:使用在每一个孩子的实体“下一个”属性链表中datomic-linklist
- S4实现的:独立包装占边为described in this post
问题实体
每个解决方案似乎公顷面临挑战。我能想到的是:
- P1:保持插入,删除或移动操作的恒定时间操作。已经有建议使用小数来表示“位置”值,以避免在重新排序时更新所有的孩子。
- P2:支持与订购的多个父亲关系
- P3:维护存储的位置或边的复杂性订购或订购更改。
- P4:更改为“位置”属性影响隐含“上次更改”日期子实体时,它实际上并没有改变
- P5:查询/拉(特别是递归查询)通过包装连接时变得困难实体
对于我的树用例,我不关心P2和P1是不是一个大问题,因为N个总体上是低
所有这些研究并没有帮助我找到哪个溶液的澄清度最适合我的树用例,但我倾向于S2。自然,最简单的复杂性是我的目标,但我怀疑所有的解决方案都是复杂的。
问题:你对这个问题有什么经验,你可以分享什么,这将有助于他人决定?正如他们指出的那样,我会在上面添加更多的R,S和P。我(和其他许多人)会真正感谢任何反馈。
A similar question在几年前被问到,但在那里发生的事情并不多。
你确定S2的链接是正确的吗? –
同意,该帖子没有明确说明订单要求。我添加了另一个。 –