根据另一个属性更改架构属性基数

Change schema attribute cardinality based on another attribute

我有以下伪模式:

A)

-- Cost-schedule: FRE494
   -- Periodic: false
   -- Type: Fixed
   -- Value: 70.00
   -- CCY GBP

B)

-- Cost-schedule: GHK999
   -- Periodic: true
   -- Period start: 01/04/2015
   -- Period end: 30/04/2015
   -- Type: Promise
   -- Filled: false
   -- Value: 0.00
   -- CCY: GBP

我试图避免任何类型的带有超级 class "Cost-Schedule" 和子 classes "Periodic" 和 "One-off" 的讨厌的等级制度。首先,我使用的不是 OO 的 clojure。也不想落入里氏换人陷阱

那么,作为 Datomic 的新手,有没有办法动态更改架构,以便根据另一个属性值修改属性基数。在这种情况下,如果 Periodic 是 "false",我们就不需要 Period-Start、Period-End。如果 Periodic 是 "true" 那么我们需要强制为这些属性设置值。

我的直觉告诉我,这是不可能的。如果没有,我如何在数据库中执行此操作?在我看来,如果我必须在将交易提交给交易者之前明确验证交易,那么我实际上只是在 Datomic 的约束之外定义一个模式,这似乎并不明智,因为许多微系统将是writing/reading 来自数据库并协调人类编写 'correct' 代码很困难!

非常感谢收到有关如何克服这一挑战的任何帮助。

我看到你的问题有两个子答案。

首先是Datomic没有定义"objects"。它真的更接近于普通地图。您的实体 B 有 3 个实体 A 没有的字段。这很好,并且不受 Datomic 的任何控制。每个属性值对都可以独立于任何其他实体添加到任何实体。仅仅因为一个映射有 4 个条目,它与另一个有 7 个条目的映射没有关系,即使映射 A 中的所有键也在映射 B 中。

第二个子答案是您的应用必须进行所有验证和完整性检查 - Datomic 不会。在 SQL 等中没有 "UNIQUE NOT NULL" 的类似物。但是,Datomic 确实支持 Database Functions,它有机会中止任何未通过用户提供的测试的事务。因此,这是一种强制执行数据完整性检查的方法。

另请查看 Tupelo Datomic,这是我为使使用 Datomic 更轻松而编写的库。