【问题标题】:Change schema attribute cardinality based on another attribute根据另一个属性更改架构属性基数
【发布时间】:2015-07-16 09:21:20
【问题描述】:

我有以下伪模式:

一)

-- 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。也不想掉入里氏换人陷阱。

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

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

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

【问题讨论】:

    标签: clojure datomic


    【解决方案1】:

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

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

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

    还请查看Tupelo Datomic,这是我编写的一个库,旨在让 Datomic 的使用更加轻松。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      相关资源
      最近更新 更多