大家好日子,
我想看看是否有可能“更改”数据模式 - 特别是在首先声明唯一后,使属性值不唯一。
架构:
{: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]])
如果您添加唯一性约束 - 必须手动更新数据以避免冲突。
答案 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)复制到具有不同组织和数据的全新数据库中。结构