接受/拒绝/完成 - 数据库中记录的状态(标志)

时间:2011-07-20 15:26:47

标签: php mysql database-design flags

这将是表格设计保持产品状态的最佳方法:

  • 产品已接受
  • 产品拒绝
  • 产品已完成(已发货)

这些是我的想法:

  1. “已接受”的int字段为“已拒绝”,另一个为“已完成”(值为0或1)

  2. 每个“已接受”,“已拒绝”和“已完成”的日期时间(默认情况下该字段为NULL)

  3. 只是一个值为1,2或3的字段“status”。

3 个答案:

答案 0 :(得分:3)

如果状态在任何时候只能是这三个中的一个,那么应该只有一个字段。所以,你的第三个想法是正确的。只有一个是必要的三个字段会浪费存储空间,所以应该避免。

最好的解决方案是简单地使用status字段来保存产品所处的三种状态中的哪一种。这也将使添加或删除状态变得容易,因为您只需要修改代码以插入不同的值,而不是数据库本身。

如果确实需要存储上次更改状态的日期,则可以使用名为last_status_change的字段作为日期时间,并在更改状态时更新为当前时间。< / p>

答案 1 :(得分:1)

这取决于您希望未来报告的详细程度。您的选项1和3实际上是相同的,因此抛弃选项1以支持更好的选项3。

现在您有两个选项,要选择一个,您需要回答以下问题:

我想知道何时设置了每个状态,还是只想

就个人而言,我会选择选项2,以防您以后想要添加任何详细的报告功能。 DATETIME字段比单个INT占用更多空间,但在大多数情况下这不是问题。

修改

或者,您可以这样做:

CREATE TABLE `status` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(64),
  PRIMARY KEY (`id`)
)

CREATE TABLE `product_status` (
  `product_id` INT NOT NULL,
  `status_id` INT NOT NULL,
  `date` DATETIME,
  PRIMARY KEY(`product_id`, `status_id`)
)

这样,您可以灵活地使用所有不同类型的状态字段,并且通过使用多对多表,您可以查看每个状态的设置时间。另外,如果您使用的是InnoDB表,则可以设置foreign keys

查询产品:

SELECT s.title, ps.date
FROM status s
LEFT JOIN product_status ps ON (s.id = ps.status_id)
WHERE (ps.product_id = MYPID)

答案 2 :(得分:1)

你的第三个选项的另一个变体是一些枚举或其他。但是int总是一个更好的主意。因为性能甚至可能是tinyint(更少的字节)。

但是你应该有一些带有3条记录的product_status(id,name)表。