2011-08-30 33 views
2

在数据库中存储请求的“正确”(最规范化?)方式是什么?例如,用户提交文章。本文在发布到网站之前必须经过审核和批准。在Mysql(或任何)数据库中存储请求的正确方法

哪个是更合适的方式:

A)它在文章表具有 “已批准” 字段,它要么是0,1,2(拒绝,批准,待定)

存储或

B)有ArticleRequests表,它具有与Articles相同的字段,并且在批准后,将行数据从ArticleRequests移动到Articles。

谢谢!

+3

我会为A保证。 – Shef

+0

我投赞成票A:这种方式可以轻松实现“删除”,“标记”(如垃圾邮件等)等。从TableA移动一行到TableB可能会出错,最终导致两篇文章或根本没有。 –

回答

4

由于每篇文章都将具有审批状态,并且每次请求文章时,您都很可能需要知道该状态 - 将其与表格保持内联。

不过,考虑调用字段ApprovalStatus。您可能希望添加一个相关的表格来包含每个状态,除非它们不会经常更改(或永远)。

编辑:理由继续在相关表中的字段有:

  • 如果相关领域并不总是适用的,或者可能经常是null
  • 如果仅在极少情况下才需要相关字段,并且通过将外键用于关联属性的相关表中可以更好地进行描述。

在你的情况下,上述原因不适用。

+0

+1表示字段名称。 –

+0

我在选择A时遇到的问题是,每次您执行SELECT语句选择并显示文章时,都需要检查ApprovalStatus是否已标记为已批准。如果您选择B,则“文章”表中的所有文章都将被批准,并且不在该表格中的所有文章都不会被批准。 –

+0

@John:有效的点,但这是一个简单的步骤,用'ApprovalStatus = 1'(其中'1'是“批准的”)添加一个WHERE子句......你甚至可以创建一个名为'ApprovedArticles'的视图来封装那逻辑。 – Yuck

1

我认为最好是将数据存储在具有特定状态的主表中。因为没有必要在表格之间移动数据,如果这个数据被批准并且文章将同时出现在网站上。如果您不想存储已拒登的文章,则应该创建cron脚本,并删除不必要的数据或将其移至归档表格。在这种情况下,你将减少加载你的分贝,因为你可以调整适当的时间去除旧的文章,例如在晚上。

关于在每个查询中使用审批状态的问题:如果您打算使用高负载的非常流行的站点来搜索或制作文章列表,您将使用独立服务器,如sphinx或solr(mysql对此不是很好的解决方案目的),你会把数据放到这些状态='批准'。使用增量索引可帮助您保持数据最新。

2

绝对做'A'。

如果你做B,你将创建一个与另一个相同的字段的新表,这意味着你做错了什么。你在重复自己。

相关问题