Clojure Alter Datomic模式(唯一->;非唯一)

Clojure Alter Datomic模式(唯一->;非唯一),clojure,schema,datomic,Clojure,Schema,Datomic,大家好, 我想看看是否有可能“改变”datomic模式——特别是在首先声明属性值唯一后,使属性值不唯一 模式: {:db/id #db/id[:db.part/db] :db/ident :vcs/reference :db/doc "Our VCS reference number for a transaction" :db/valueType :d

大家好,

我想看看是否有可能“改变”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}
这样做的可能性听起来并不正确,因为:

  • 它正在改变历史
  • 如果以其他方式应用(非唯一->唯一),将创建数据
    冲突
有人能澄清一下吗

更新

以防其他人搜索

更新2

为了解决我的特殊问题,我做了以下工作:

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

在添加唯一性约束的情况下,必须手动更新数据以避免冲突。

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

如果您的db属性需要进化(什么时候不进化?),您可能希望像RESTAPI中的路由一样对其进行版本化。通过向命名空间中添加“.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中的每个表):


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

感谢您发布此链接-这是一个我以前从未见过的较新的文档页。是的,希望它也能为其他人节省时间。
:db/ident              :vehicle.v42/horsepower
:db/valueType          :db.type/double