高效的MySQL结构,用于将功能链接到住宿列表

时间:2016-07-29 09:49:16

标签: mysql

我正在为特定城镇建造住宿租赁网站。 它将包括,房屋,度假村,酒店等。

我正在寻找有关如何最好地将房产特征(空调,游泳池等)与个别房产联系起来的建议。

我有一个大约50个属性功能的表,设置为feature_id,feature_category,feature_name。

存储哪些功能与哪个属性相关的最佳方法是什么?

包含feature_id数组的属性表(prop_features)中的列是最好的方法吗?

我设法找到并能够剖析数据库的唯一示例显示添加的功能为feature_1,feature_2等,这似乎非常低效,因为某些属性可能只有feature_1和feature_49。 每个都作为列添加到property_table。

我是从头开始创建数据库的新手,所以我非常感谢有关如何最好地从项目的这一部分开始的任何建议。 (这也是为什么我没有太多运气用谷歌搜索它,因为我不确定如何用更一般的术语来解释它)。

2 个答案:

答案 0 :(得分:1)

一个解决方案是将连接属性的中间表添加到如下功能中:

CREATE TABLE propertyfeatures (property_id INT, feature_id INT);

如果我们有一个名为Acme Hotel(物业ID 1)的房产,有空调(功能ID 2)和游泳池(功能ID 4),数据看起来像:

property_id | feature_id
1             2
1             4

要检索每个属性的功能(不包括没有功能的属性),一个简单的查询将是:

SELECT 
    p.property_name,
    f.feature_name,
    f.feature_category
FROM property AS p 
INNER JOIN propertyfeatures AS pf 
    ON p.property_id = pf.property_id 
INNER JOIN features AS f 
    ON pf.feature_id = f.feature_id
GROUP BY p.property_id 

注意:我已对现有数据库中的表名和列名做出假设。您必须相应地调整上述内容。

  

我设法找到并能够剖析数据库的唯一示例显示添加的功能为feature_1,feature_2等,这似乎非常低效,因为某些属性可能只有feature_1和feature_49。每个都作为列添加到property_table。

虽然可以做到这一点,但你的纠正是因为它效率低下,或者说维护起来很尴尬。它被称为 pivoting ,因为您将唯一的行值更改为多个列。例如,如果添加了新功能(例如免费Wifi)怎么办?它不是简单地插入新的数据行,就像使用中间表一样,您必须创建一个新列来支持它。

不仅如此,您还需要手动或动态定义要素列。作为参考,请查看MySQL Pivot Table,其中演示了手动和动态方法。

答案 1 :(得分:1)

一种简单的方法是将另一个表添加到具有列的数据库中。这种方法的关键词是"联结表",它在数据库设计中非常基础。

property_identifier | feature_identifier (feature_id in your case)

在此表中,您可以显示属性和特定功能之间的连接。

所以你可以说property_id 1的属性有一个池(feature_id:2)和一个漂亮的厨房(feature_id:23)

所以表格看起来像这样:

propery_id | feature_id
  1        | 2
  1        | 23