Clojure Alter Datomic模式(唯一->;非唯一)
大家好, 我想看看是否有可能“改变”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
{: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}
这样做的可能性听起来并不正确,因为:
- 它正在改变历史
- 如果以其他方式应用(非唯一->唯一),将创建数据
冲突
(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