更改Datomic架构(唯一 - >不唯一)

时间:2017-04-05 13:07:45

标签: clojure schema datomic

大家好日子,

我想看看是否有可能“更改”数据模式 - 特别是在首先声明唯一后,使属性值不唯一

架构:

    {:db/id                 #db/id[:db.part/db]
     :db/ident              :vcs/reference
     :db/doc                "Our VCS reference number for a transaction"
     :db/valueType          :db.type/string
     :db/cardinality        :db.cardinality/one
     :db.install/_attribute :db.part/db}

    {:db/id               :vcs/reference
     :db/unique           :db.unique/value
     :db.alter/_attribute :db.part/db}

这样做的可能性听起来不对,因为:

  • 正在改变历史
  • 如果以其他方式应用(非唯一 - >唯一)将创建数据
    冲突。

有人可以澄清一下吗?

更新

发现Datomic Schema-Alteration doc以防其他人搜索。

更新2

为了解决我的特殊问题,我已经完成了以下工作:

 (d/transact-async conn [[:db/retract :vcs/reference :db/unique :db.unique/value]
                         [:db/add :db.part/db :db.alter/attribute :vcs/reference]])

如果您添加唯一性约束 - 必须手动更新数据以避免冲突。

1 个答案:

答案 0 :(得分:1)

一个相关的观点是,与SQL表中的列不同,属性永远不会被“删除”。你所能做的就是停止使用它们并“忘记”它们曾经存在过。

如果您的数据库属性需要进化(并且不需要它们?),您可能希望像REST API中的路由一样对它们进行版本控制。通过向命名空间添加“.v2”等组件可以轻松完成此操作:

:db/ident              :person.v1/age
:db/valueType          :db.type/string

可以替换为:

:db/ident              :person.v2/age
:db/valueType          :db.type/long

然后:

:db/ident              :person.v3/age
:db/valueType          :db.type/double

请注意,不同的属性组可能会有不同的版本(例如SQL db中的每个表):

:db/ident              :vehicle.v42/horsepower
:db/valueType          :db.type/double

当然,如果您的数据库发生了足够的变化,最终可能需要将数据(ETL)复制到具有不同组织和数据的全新数据库中。结构