多个布尔属性与新 table
Multiple boolean attributes vs. New table
我正在设计 mall
和 brands
之间的关系,可在商场购买。
品牌数量固定。不过,未来可能会增加。现在,一个购物中心可能有 some/all 个品牌。
我的问题是:
我是否应该像这样将不同的品牌作为布尔属性添加到 mall
table 中:
mall
----------------------------------------------------------------------------
mall_id | mall_name | peter_england | turle | adidas | puma |
----------------------------------------------------------------------------
1 xyz false true true false
2 abc true false true true
----------------------------------------------------------------------------
或
在 mall
和新的 brand
table 之间创建 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
----------------------------------------------------------------------------
在这种情况下,我应该将它们存储为属性,还是像以前一样创建新的 table?
根据与@Gerrat
的讨论,在一些误解后更新答案
当然第二种更好
第一个 table 是第一范式,因为它的 none 域(字段值)有任何集合作为元素(具有多值的列)。但问题在于重复的列(品牌在 table 中作为列重复只是为了在商场中标记),这样的设计通常被认为是一种反模式,但是因为它限制了 table 到预定的固定数量的值,因为它强制为每个列重复查询和其他业务逻辑。换句话说,它违反了“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
Normalization: What does "repeating groups" mean?
答案显然是:视情况而定。
在 99% 的情况下,第二个版本是可供选择的。它被适当地标准化,因此相当灵活。 OLTP 系统的发展方向。
如果您正在处理数据仓库,那么第一个版本可能更好,甚至是第三个版本,您基本上可以在第二个版本中获得三个 table 的连接结果版本为 table.
我正在设计 mall
和 brands
之间的关系,可在商场购买。
品牌数量固定。不过,未来可能会增加。现在,一个购物中心可能有 some/all 个品牌。
我的问题是:
我是否应该像这样将不同的品牌作为布尔属性添加到 mall
table 中:
mall
----------------------------------------------------------------------------
mall_id | mall_name | peter_england | turle | adidas | puma |
----------------------------------------------------------------------------
1 xyz false true true false
2 abc true false true true
----------------------------------------------------------------------------
或
在 mall
和新的 brand
table 之间创建 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
----------------------------------------------------------------------------
在这种情况下,我应该将它们存储为属性,还是像以前一样创建新的 table?
根据与@Gerrat
的讨论,在一些误解后更新答案当然第二种更好
第一个 table 是第一范式,因为它的 none 域(字段值)有任何集合作为元素(具有多值的列)。但问题在于重复的列(品牌在 table 中作为列重复只是为了在商场中标记),这样的设计通常被认为是一种反模式,但是因为它限制了 table 到预定的固定数量的值,因为它强制为每个列重复查询和其他业务逻辑。换句话说,它违反了“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
Normalization: What does "repeating groups" mean?
答案显然是:视情况而定。
在 99% 的情况下,第二个版本是可供选择的。它被适当地标准化,因此相当灵活。 OLTP 系统的发展方向。
如果您正在处理数据仓库,那么第一个版本可能更好,甚至是第三个版本,您基本上可以在第二个版本中获得三个 table 的连接结果版本为 table.