我正在设计商场提供的mall
和brands
之间的关系。
品牌数量是固定的。但是,将来可能会增加。现在,商场可能会展示一些/所有品牌。
我的问题是:
我应该将不同品牌作为布尔属性添加到mall
表中,如下所示:
mall
----------------------------------------------------------------------------
mall_id | mall_name | peter_england | turle | adidas | puma |
----------------------------------------------------------------------------
1 xyz false true true false
2 abc true false true true
----------------------------------------------------------------------------
OR
在mall
和新brand
表格之间创建N:M关系,如下所示:
mall mall_brand brand
------------------------- --------------------- --------------------------
mall_id | mall_name | mall_id | brand_id brand_id | brand_name
------------------------- --------------------- --------------------------
1 xyz 1 2 1 peter_england
2 abc 1 3 2 turtle
------------------------- 2 1 3 adidas
2 3 4 puma
2 4 --------------------------
---------------------
我个人觉得第二个更灵活,因为它只存储true
个值。此外,它还为我提供了在未来为个别品牌添加额外属性的条款。此外,添加新品牌非常简洁。
修改
还要考虑所有这些品牌都存在于每个商场的情况,而不是存储布尔值,我们存储浮动值,用于每天为每个品牌销售的平均服装数量,如下所示:
mall
----------------------------------------------------------------------------
mall_id | mall_name | peter_england | turle | adidas | puma |
----------------------------------------------------------------------------
1 xyz 10.4 21.3 13.7 7.6
2 abc 10.7 25.5 11.4 8.1
----------------------------------------------------------------------------
在这种情况下,我应该将它们存储为属性,还是像以前一样创建新表?
答案 0 :(得分:3)
根据与@Gerrat讨论后的一些误解后更新答案
当然第二种方式更好。
第一个表是First Normal Form,因为它的所有域(字段值)都没有任何集合作为元素(具有多值的列)。但问题在于重复的列(在表中重复作为列的品牌只是在商场中标记),这样的设计通常被认为是反模式,但是因为它将表限制为预定的固定数量的值并且因为它强制为每个列重复查询和其他业务逻辑。换句话说,它违反了" DRY"设计原则。
始终尽量使您的数据库易于维护和规范化。
参考文献:
https://en.wikipedia.org/wiki/Database_normalization
https://en.wikipedia.org/wiki/First_normal_form
https://en.wikipedia.org/wiki/Second_normal_form
https://en.wikipedia.org/wiki/Third_normal_form
https://en.wikipedia.org/wiki/Boyce%E2%80%93Codd_normal_form
答案 1 :(得分:1)
答案很明显:这取决于。
在99%的情况下,第二个版本是可供选择的。它被正确地归一化,因此相当灵活。 OLTP系统的方法。
如果你正在开发一个数据仓库,那么第一个版本可能是更好的版本,甚至是第三个版本,你基本上可以将第二个版本中三个表的连接结果作为表格。