这将是表格设计保持产品状态的最佳方法:
这些是我的想法:
“已接受”的int字段为“已拒绝”,另一个为“已完成”(值为0或1)
每个“已接受”,“已拒绝”和“已完成”的日期时间(默认情况下该字段为NULL)
只是一个值为1,2或3的字段“status”。
答案 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)表。