【问题标题】:Database Design: Storing previous version versus storing first version in version control systems数据库设计:存储以前的版本与在版本控制系统中存储第一个版本
【发布时间】:2019-06-01 20:01:21
【问题描述】:

我对使用数据库和数据库设计/创建模式非常陌生,非常感谢一些建议/建议。我正在创建一个用户输入数据的应用程序,并且我正在向用户提供该数据的版本控制。用户可以进入并恢复更改或更新值(有点像 git)等,我正在创建一个数据库结构来存储这些值。目前我有两种不同的可能性,但我不确定哪一种更有优势。

第一种可能性:存储指向先前版本的指针

数据表

id 整数字段

data_content 文本字段

version_control_first_version ForeignKeyField(Data_Version_Control_Table)

Data_Version_Control_Table

id 整数字段

previous_version SelfReferentialForeignKey Nullable

在第一种可能性中,我在版本控制表中存储了一个指向先前版本数据的链接。随着新版本开始涌入,我在版本控制表中创建新行,并为每个新行将行链接到先前版本的行。数据表只保存最新版本的数据(我决定将当前版本保存在不同的表中,因为这是我用例的最佳方法,版本控制表应该比当前版本表大得多,因为那里有很多条目)。

第二种可能性:存储指向根/第一个版本的指针

数据表

id 整数字段

data_content 文本字段

version_control_first_version ForeginKeyField(Data_Version_Control_Table)

Data_Version_Control_Table

id 整数字段

first_version SelfReferentialForeignKey Nullable

version_number 整数字段

对于这种设计,对于相同数据的所有版本,我存储指向数据的第一个版本的指针,而不是之前的版本和版本号。当我想回滚到特定版本时,我会跳过我需要的版本数,以获取我正在寻找的版本。这是这里唯一的区别,其余的几乎相同。我还可以补充一点,如果这可能有帮助,我也会存储这些版本的创建日期时间。

这些选项是否有任何显着的优点或缺点可以证明使用其中一个是合理的?如果我使用其中一个,性能会受到影响吗?哪一个将允许更快和更容易的查询,哪一个是最佳模型?这些模型有什么缺陷吗?

提前感谢您的帮助,祝您有美好的一天:)

【问题讨论】:

  • 如果要能够回滚,第一个版本有什么用?你需要以前的版本,对吧?
  • 看看"Programming with databases"一书的“数据结构示例——时序数据”一章。
  • @GolezTrol 抱歉,我忘了说我还存储了版本号,这意味着我可以回滚到数据库中的任何版本。将更新问题

标签: mysql sql database database-design relational-database


【解决方案1】:

在这两种情况下,您都试图在关系数据库中模拟指针,其中:

  • 不容易通过数据库约束强制执行。例如,您不能以声明方式保证version_control_first_versionfirst_version 确实指向第一个版本,或者previous_version 不会形成分支或循环。
  • 不太适合索引的工作方式。例如,遍历previous_version 的“链表”将需要递归 CTE 或重复查询。 ˙first_version` 在这方面更好,但仍然不必要地复杂。

IMO,最好将版本表设为weak entity

CREATE TABLE Data_Table (
    id INT PRIMARY KEY
    -- Other fields...
);

CREATE TABLE Data_Version_Control_Table (
    id INT REFERENCES Data_Table,
    version_number INT,
    PRIMARY KEY (id, version_number)
    -- Other fields...
);

然后:

  • 第一个版本可以通过查找给定idMIN(version_number) 来有效识别。 MIN/MAX 在 B-Tree 中查找效率很高,基本上相当于索引查找。
  • 之前的版本也可以高效的找到(通过搜索之前的version_number)。这只是一个索引搜索。
  • 可以通过搜索对象的id 有效地找到同一对象的所有版本。这只是一个索引范围扫描,不需要“列表遍历”(作为奖励,版本已经按正确的顺序排列)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2018-06-19
    • 1970-01-01
    • 2010-09-16
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多