【发布时间】:2016-06-24 19:33:47
【问题描述】:
我正在努力使我的数据库设计正确。它是由啤酒、白酒、葡萄酒等组成的一大组酒精饮料。我可以将它们全部保存在一个表中,如下所示:
id category brand type price quantity description
1 Beer Heineken bottle $2.00 100 some description...
2 Beer Calsburg bottle $3.00 200 some description
3 Beer Heineken can $1.00 300 some description....
4 Liquor JWalker bottle $30.00 100 some descri...
考虑到类别和品牌会出现重复,这似乎是一个糟糕的设计。因此,我将其拆分为 3 个表,如下所示:
分类表
id name(pk)
1 Beer
2 Liquor
品牌表
id name(pk) category_name(FK)
1 Heineken Beer
2 Carlsburg Beer
3 Lindemans Wine
4 JWalker Liquor
产品表
id(PK) type price quantity description category_name(FK) brand_name(FK)
1 Bottle $2.00 100 some description Beer Heineken
认为这会更好地标准化,但在我看来,与第一个表几乎没有区别。我也以重复类型结束,因为我可以在瓶子上重复,罐头等等。那么我应该为此获得第四张桌子吗?
尝试正常化并使其尽可能合理。有没有更好的方法来做到这一点?
【问题讨论】:
-
我认为如果它们始终是唯一的,那么将名称用作 PK 是可以的,但是,正如 OP 指出的那样......由于没有与品牌或类别相关的额外数据,拆分并没有太大优势离开桌子。
-
说喜力被另一家公司买断/出售和/或重新命名。您想更新所有产品还是只更新品牌表中的一条记录?单个表可能很诱人,但从长远来看会降低灵活性(可能不是减少而是增加返工)。您是否计划让这个系统不断变化?如果是这样,请尽可能接近 3rd/4th。 如果这就是它的全部内容并且您没有预料到变化,那么单个表将“更快”,只是维护更加困难。
-
所以成本效益,现在快速简单,以后更痛苦。或者现在稍微痛苦一点,以便以后减少痛苦/返工。你现在有时间愿意承受更多的痛苦吗?如果没有,请快速轻松并稍后更正。但是,如果现在有很多代码违背了这种结构,那么现在就编写代码,否则以后会有很多返工..
-
@xQbert 添加 ids 与规范化无关。
-
接受的答案没有标准化。规范化不会引入新列。您没有提供足够的信息来规范化;但根据常识和列名,您的第一个表在 5NF 中。您似乎认为重复的子行值意味着需要规范化。他们没有。 (请参阅我的回答。)请提供您的表中保存的 FD,以及始终是其他表连接的任何其他情况。请说当一行(id,...)进入您的 tab.e 时。 PS你能清楚地解释一下“类别和品牌的重复”是什么意思吗?
标签: mysql oracle database-normalization