在这种情况下,我应该使用带有布尔标志的多对多或一个表吗?

时间:2018-05-06 09:14:49

标签: mysql database database-design relational-database

我有一个properties表,每个property可以有多个amenities

amenities的例子是" hasTerrace"," hasGarden"和#34; hasPrivateParking"。 大约有50种设施

amenities列表将来不太可能改变。我看到两个选择:

  1. properties表中为50个左右的字段添加布尔标记,例如" hasTerrace"。
  2. 创建名为amenitiesproperty_amenity的单独表格,并建立many-to-many关系。
  3. 一个典型的用例是查询具有任何给定数量设施的所有房产。

    我倾向于将所有内容保存在一个表中并使用布尔值,因为:

    1. 设施清单不太可能改变。
    2. 我认为我的查询速度会更快(可能是因为可以完成所有数据库调整而产生的废话)。
    3. 我的查询会更简单。
    4. 我会编写更少的代码,代码也不会那么复杂。
    5. 然而,表中有60个左右的字段似乎相当高。

      哪个是上述问题的最佳数据库设计?

1 个答案:

答案 0 :(得分:0)

考虑使用

SET ('hasTerrace', 'hasGarden', ...) NOT NULL

50个属性只需7个字节。设置和测试有点复杂;参见手册。

类似地,BIGINT UNSIGNED允许8个字节中最多64个标志,但是你需要使用数字0..63和&#34; shift&#34; (例如,1 << 22)。

使用BIGINT方法,您可以轻松地[&nbsp;在单个WHERE子句中测试任意数量的标志是打开/关闭的。

在不知道您需要执行哪些类型的查询的情况下,我不能推荐一个与另一个相比。