如何对数据库中表的记录进行版本化?
Posted
技术标签:
【中文标题】如何对数据库中表的记录进行版本化?【英文标题】:How to version records of table in database? 【发布时间】:2020-07-20 06:09:06 【问题描述】:我在存储要购买的产品的数据库中有一个表(我们将表称为产品)。有必要跟踪每个产品的变化。我对版本记录有 2 个想法。
首先是通过复制产品并覆盖不同的字段并在旧版本和新版本的记录中保留引用来在产品中创建新记录。在这种情况下,产品表中的记录是只读的,但指示产品是否已归档的字段除外。
其次是创建 2 个表:Product 和 ArchivisedProduct。产品的记录是可编辑的,但每次更改都会在 ArchivisedProduct 中创建一条新记录,其中仅存储差异(因此除了 id,所有字段都可以为空)并且表的字段相互引用。
您知道任何可以管理该过程并与 Node.js、Prisma、PostgreSQL 和 Apollo 配合使用的工具吗?对于这种用途,我推荐使用winston/papertrail,但是当我阅读文档时,它似乎只创建日志。
示例数据库结构以获得更多权限: 第一个例子:
type Product
id: Int! @id
name: String!
price: Float!
archived: Boolean!
productVersionIds: [Product]!
第二个例子:
type Product
id: Int! @id
name: String!
price: Float!
archivisedProductIds: [ArchivisedProduct]! @relation(name: "ProductToArchiva")
type ArchivisedProduct
id: Int! @id
name: String
price: Float
product: Product! @relation(name: "ProductToArchiva")
【问题讨论】:
【参考方案1】:根据您打算存储的产品数量,将每个产品版本存储在 ProductVersion
模型中可能会更简单,然后在 Product
模型中密切关注最新的产品(“头部”) .
你会有:
type ProductVersion
id: Int!
version: Int!
name: String!
price: Float!
@@id([id, version])
type Product
productId: Int! @id
headVersion: Int!
productVersion: Product! @relation(fields: [productId, headVersion], references: [id, version])
对于产品的每次更改,您都将存储包含信息的新ProductVersion
,并更新相应的Product
以将headVersion 指向新的ProductVersion
。这将是单个事务的一部分,以确保一致性。
要查询您的产品列表,您可以使用Product
对象并加入ProductVersion
。
如果您存储大量产品并且需要考虑加入,您可以考虑在Product
中保存整个ProductVersion
数据的副本,而不是通过headVersion
字段使用关系。
请注意,这也意味着您将在运行时计算差异,而不是将它们直接存储在数据库本身中。
【讨论】:
以上是关于如何对数据库中表的记录进行版本化?的主要内容,如果未能解决你的问题,请参考以下文章