如何在数据库设计中处理实体的版本

J86*_*J86 4 erd database-design version-control

我正在做一个新项目。项目的域逻辑如下:

用户上传文件(文档)并给出标题,然后另一个用户出现并且(她)也尝试上传具有相同标题的文件。只要文档的正文有差异,这就可以了。

如何设计我的域模型,以便稍后使用数据的 Web 应用程序可以通知查看特定文档的用户“嘿,此文档还有另一个版本”。

这是我所拥有的一个简单的 ERD,但这显然不能执行我上面想要的。

在此处输入图片说明

我将不胜感激任何帮助和建议。

谢谢

Fru*_*ner 7

您可以将它们全部保存在同一个表中,只需使用一列来跟踪版本号:

文件
---------
  id(PK的一部分)
  version_number(PK的一部分)
  标题
  文件
  creator_id(FK 到 users.id)
  version_date(创建此版本的日期 - 不是必需的,但最好有)
  文件

当添加新记录但它是现有文档的新版本时,您的应用程序将需要能够处理更新文档的版本号。您还需要确保将任何文档元数据(例如Title)更改传播到所有相关文档。您可以通过允许文档 ID 不是唯一的来实现此目的,并且主键是文档 ID 和版本号的组合。否则,可能无法确定要更新哪个记录。

另一种方法是为文档元数据创建一个存根,并为所有版本创建一个单独的表:

文件
---------
  身份证(PK)
  标题
  创建者(FK 到 users.id)
  (其他元数据)

文档版本
-----------------
  身份证(PK)
  document_id(FK 到documents.id)
  文档版本号
  文件
  (其他领域)

第二个选项是一个稍微复杂的结构,但会为您提供更好的参照完整性,因为所有版本都必须通过外键链接到文档存根。

就个人而言,我会选择第二个版本。

  • 我实际上推荐第一个版本,因为它允许更改文档的标题和创建者/所有者。考虑一个 `IsCurrent` 位字段,它使查询更简单。 (2认同)
  • 您可以输入另一个增加 version_number 但更小的 version_date 的版本。你想防止这种情况吗? (2认同)