数据库设计:在版本控制系统中存储以前的版本与存储第一个版本

时间:2019-01-07 06:41:51

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

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

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

数据表

id IntegerField

data_content TextField

version_control_first_version ForeignKeyField(Data_Version_Control_Table)

Data_Version_Control_Table

id IntegerField

previous_version SelfReferentialForeignKey可为空

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

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

数据表

id IntegerField

data_content TextField

version_control_first_version ForeginKeyField(Data_Version_Control_Table)

Data_Version_Control_Table

id IntegerField

first_version SelfReferentialForeignKey可为空

version_number IntegerField

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

这些选项是否有任何明显的优点或缺点可以证明使用一个选项优于另一个选项?如果我将一个使用于另一个,是否会对性能产生影响?哪一个将允许更快,更轻松的查询,哪个是最佳模型?这些模型中是否有任何缺陷?

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

1 个答案:

答案 0 :(得分:0)

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

  • 不能通过数据库约束轻松实施。例如,您不能声明性地保证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...
);

然后:

  • 通过为给定的MIN(version_number)找到id可以有效地标识第一个版本。 MIN / MAX可以高效地在B树中找到,基本上等效于索引查找。
  • 还可以有效地找到先前的版本(通过搜索先前的version_number)。这只是一个索引查找。
  • 可以通过搜索对象的id来有效地找到同一对象的所有版本。这只是一个索引范围扫描,不需要“遍历列表”(此外,版本已经按正确的顺序排列了。)