具有类似wiki功能的应用程序的数据库设计

时间:2016-02-11 10:31:54

标签: database database-design

我正在使用web api 2和sql server为电影/电视/演员等制作api。该数据库现在有> 30个表,其中大多数存储数据用户将能够编辑。

我应该如何存储旧版本的条目?

说某人编辑电影表中条目(电影)的描述,运行时和标语。

我会有一张桌子(movies_old),我将可编辑的文件存储在电影'是谁/何时编辑。

全部在同一个数据库中。 ' ??? _ old'表没有关系。

我对数据库设计很陌生。这有什么明显的错误吗?

1 个答案:

答案 0 :(得分:1)

在我看来,这里有两个问题:您存储数据的表格以及“历史价值”字段中的内容。

关于第一个问题,有两个明显的选项:在同一个表中存储旧记录和新记录,其中某种指示是“当前”,哪个是“历史”,或者有一个单独的历史表。

一个表的主要优点是您拥有更简单的架构。如果表包含许多字段,则尤其如此。如果有两个表,则所有字段定义都是重复的。将数据从当前表移动到历史记录表时,必须复制每个字段,如果字段列表发生更改,或者其格式发生更改,则必须记住更新副本。显示历史记录的任何查询都必须读取两个表。等等,但只有一张桌子,所有这一切都消失了。将记录从当前转换为历史只是意味着更改“is_current”标志的设置,或者您指示它。

两个表的主要优点是,(a)访问可能有点快,因为您没有太多不相关的记录可以跳过。 (b)在阅读当前表时,您不必担心排除历史记录。

哦,关于SQL的一件烦人的事情:原则上你可以在每条记录上加上日期,然后最新日期的记录就是当前记录。在实践中,这是一个痛苦:您通常必须有一个内部查询来查找最新日期,然后将其反馈到外部查询,该查询将使用该日期重新读取记录。 (有些SQL引擎可以解决这个问题。例如Postgres。)所以在实践中,你需要一个“is_current”标志,可能是1表示当前值,0表示历史记录或者其他一些。

另一个问题是放入内容的内容。如果您正在处理短字段,客户编号和开帐单金额等等,那么简单易行的方法就是将完整的旧内容存储在一条记录中,并将新内容存储在新记录中。但是如果你正在处理一个长文本块,比如情节概要或评论,那么可能会有许多小的编辑修改。如果每次有人修复语法或拼写错误,我们都会有一个包含整个1000个字符的全新记录,其中5个字符不同,这可能会使数据库混乱。如果是这种情况,您可能想要研究更有效地存储更改的方法。可能或可能不是您的问题。