Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 基于另一个属性更改架构属性基数_Clojure_Datomic - Fatal编程技术网

Clojure 基于另一个属性更改架构属性基数

Clojure 基于另一个属性更改架构属性基数,clojure,datomic,Clojure,Datomic,我有以下伪模式: (A) (B) 我试图避免任何一种带有超级类“成本计划”和子类“周期性”和“一次性”的讨厌的层次结构。首先,我使用的clojure不是OO。也不想落入利斯科夫替补陷阱 因此,作为Datomic的新手,是否有一种方法可以动态更改模式,以便基于另一个属性值修改属性基数。在这种情况下,如果周期为“false”,我们不需要周期开始,周期结束。如果Periodic为“true”,那么我们需要强制这些属性具有值 我的直觉说,这是不可能的。如果没有,我如何在DB中强制执行?在我看来,如果我必

我有以下伪模式:

(A)

(B)

我试图避免任何一种带有超级类“成本计划”和子类“周期性”和“一次性”的讨厌的层次结构。首先,我使用的clojure不是OO。也不想落入利斯科夫替补陷阱

因此,作为Datomic的新手,是否有一种方法可以动态更改模式,以便基于另一个属性值修改属性基数。在这种情况下,如果周期为“false”,我们不需要周期开始,周期结束。如果Periodic为“true”,那么我们需要强制这些属性具有值

我的直觉说,这是不可能的。如果没有,我如何在DB中强制执行?在我看来,如果我必须在将事务提交给事务处理程序之前显式验证事务,那么我实际上只是在Datomic约束之外定义了一个模式,这似乎并不明智,考虑到许多微系统将从数据库中写入/读取,协调人类编写“正确”代码是很困难的


非常感谢您对如何克服这一挑战的任何帮助。

我看到您的问题有两个小答案

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

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

请也看看,我写的一个库,使使用Datomic更加轻松

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