根据其他属性更改架构属性基数

时间:2015-07-16 09:21:21

标签: clojure datomic

我有以下伪模式:

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

我试图避免任何一种令人讨厌的层次结构与超类“成本计划”与子类“周期”和“一次性”。首先,我使用的是不是OO的clojure。也不想陷入Liskov Substitution陷阱。

因此,作为Datomic的新手,有没有办法动态更改架构,以便根据其他属性值修改属性基数。在这种情况下,如果Periodic为“false”,我们不需要具有Period-Start,Period-End。如果Periodic为“true”,那么我们需要强制使用这些属性的值。

我的直觉说,这是不可能的。如果没有,我如何在数据库中强制执行此操作?在我看来,如果我必须在将交易提交给交易者之前明确验证交易,那么我真的只是在Datomic的约束之外定义一个模式,这似乎并不明智,因为许多微系统将是从DB写入/读取并协调人类编写“正确”代码很困难!

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

1 个答案:

答案 0 :(得分:1)

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

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

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

请查看Tupelo Datomic,我写的一个库,使用Datomic更轻松。

相关问题