对于数据库设计,如果列的值来自常量字符串列表,例如status
,type
。我应该创建一个新表并使用外键还是只在同一个表中存储普通字符串。
例如,我有一个状态为orders
的表:
----------------------------
| id | price | status |
----------------------------
| 1 | 10.00 | pending |
| 2 | 03.00 | in_progress |
| 3 | xx.xx | done |
上表的替代方法是在订单表中拥有order_status
表并存储status_id
。我不确定这里是否需要另一张桌子。
答案 0 :(得分:1)
如果不仅仅是经常添加几个不同的值和/或值,您应该使用标准化数据模型,即表格。
否则您也可以选择列,但需要添加CHECK(status in ('pending','in_progress,'done'))
以避免错误数据。这样,您可以在没有FK的情况下获得相同的一致性。
为节省空间,您可以使用缩写(一个或几个字符,例如'p', 'i', 'd'
),但不能使用无意义的数字(1,2,3
)。可以使用CASE在视图级别中解析长值。
ENUM是专有的,所以恕我直言更好地避免它...
答案 1 :(得分:0)
为静态值创建表不是一个好习惯。
相反,您可以使用具有预设值的ENUM类型作为示例:
CREATE TABLE orders (
id INT,
price DOUBLE,
status ENUM('pending', 'in progress', 'done')
);
答案 2 :(得分:0)
每个解决方案都有优缺点,您需要为自己的项目选择最佳解决方案,如果最初选择不好,您可能需要稍后切换。
在您的情况下,直接存储状态可以很好。但是,如果要防止存储在数据库中的无效状态,或者您的状态文本很长,则可能需要使用外键约束单独存储它们。
ENUM是另一种解决方案。但是,如果以后需要新状态,则必须更改表定义,这可能是一件非常糟糕的事情。
答案 3 :(得分:0)
如果状态具有与之关联的额外数据(如显示顺序或颜色),则需要单独的表。此外,从表格中选择预先输入的值可以防止半重复值(例如,一个人可能会写#34;正在进行"而另一个人可能会写" in_progress"或"进展& #34;)并帮助搜索具有相同状态的订单。
我会选择一个单独的表,因为它允许更多功能并降低错误。
答案 4 :(得分:0)
我将使用order_status
表,其文字作为主键。然后,在orders
表中,在status
列上进行级联更新,以防您修改order_status
表中的文字。这样,您就可以保持数据一致性并避免联接查询。