我有以下伪模式:
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写入/读取并协调人类编写“正确”代码很困难!
非常感激地收到了有关如何克服这一挑战的任何帮助。
答案 0 :(得分:1)
我看到你问题的两个子答案。
首先,Datomic没有定义“对象”。它真的更接近普通地图。您的实体B有3个实体A没有的字段。这很好,并且不受Datomic的任何控制。每个属性 - 值对可以独立于任何其他实体添加到任何实体。只是因为一个地图有4个条目,它与另一个有7个条目的地图没有任何关系,即使地图A中的所有关键字也在地图B中。
第二个子答案是您的应用必须进行所有验证&完整性检查 - Datomic不会。在SQL等中没有“UNIQUE NOT NULL”的类似物。但是,Datomic确实支持Database Functions,它有机会中止任何未通过用户提供的测试的事务。因此,这是实施数据完整性检查的一种方式。
请查看Tupelo Datomic,我写的一个库,使用Datomic更轻松。