【发布时间】:2012-04-24 03:14:10
【问题描述】:
我有一个基本的 CRUD 网络应用程序,人们可以在其中创建/编辑文章。我现在想添加保留所有编辑的修订历史的功能。目前,我有一个 Articles 表,如下所示:
Article(id, title, content, author_id, category_id, format)
我考虑了 2 个选项来更改我当前的架构以添加对修订历史的支持。基本思想是将任何文章的每一次编辑都存储为修订表中的记录。所以 Articles 和 Revisions 是一对多的关系。
第一个选项(标准化): 一张表用于文章元数据,一张用于修订。没有存储重复数据。
Article(id, title, category_id)
Revision(id, content, author_id, format)
第二个选项(去规范化): 两个表与选项 1 类似,但有一些重复的列。
Article(id, title, content, author_id, category_id, format)
Revision(id, article_id, content, author_id, format)
我正在考虑使用第二个选项,因为它会使我的编码更容易(不那么复杂,代码行数更少)。我知道这不是“学术的”和“纯粹的”,但我个人的感觉是,必须进行额外的连接会损害代码维护。此外,性能应该会更好,因为不需要进行那么多的连接。
这是完成这项任务的好方法吗?我可能忽略了任何不可预见的或长期的后果?
【问题讨论】:
-
JNK 是正确的(尽管 SE 中的 SQL 没有针对连接进行优化 - RDBMS 是。虽然细节)。我们的发票应用程序也有类似的问题,但“历史”表是发票表的精确副本,还有一些附加字段(历史 PK、时间戳等)。易
INSERT INTO HISTORY SELECT NULL,NOW(),...,i.* from invoices i
标签: sql database-design schema rdbms