Mysql - 存储有关表中项目的是/否重复详细信息的最佳方法

时间:2015-07-28 05:57:38

标签: mysql sql database

我在db中有一张公寓列表,每个公寓都有设施。

我用来保存公寓列表中的设施,但这是一个问题,因为有时我需要添加/编辑设施,没有设施的公寓会占用不必要的字段。

表格如下(有更多便利设施):

+----+---------+---------+-------+------+
| id | Address | Doorman | Cable | Pets |
+----+---------+---------+-------+------+
|  1 | E 55th  |       1 |     0 |    1 |
|  2 | E 72th  |       0 |     1 |    1 |
+----+---------+---------+-------+------+

我可以用哪种方式存储这类数据?

可能正确的方法是将设施存放在不同的桌子上,但是我如何按设施查询公寓?

现在查询我做Select * from table where Cable=1

2 个答案:

答案 0 :(得分:1)

正确的方法是创建另一张桌子(例如设施)。我们假设我们有这些表格:

CREATE TABLE `apartments` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `address` VARCHAR(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `amenities` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `amenity_id` enum('doorman','cable','pets') NOT NULL,
  `apartment_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_amenities_apartments_idx` (`apartment_id`),
  CONSTRAINT `fk_amenities_apartments` FOREIGN KEY (`apartment_id`) REFERENCES `apartments` (`id`)
);

查询将如下:

select ap.*
from apartments as ap
    left join amenities as am on (ap.id = am.apartment_id)
where am.amenity_id = 'cable';

当然,您可以使用另一种表格结构来设置,但一般原则是相同的。

随意提出改进答案。

答案 1 :(得分:1)

恕我直言,存储这些信息的最佳方法是创建一个三表视图。 第一张桌子只会存放公寓的信息。 第二个表将是一个设施词典,将每个设施转换为id(id_amenity / amenity_name)(表名为amenities)。 最后,您将有一个表格,您将在其中存储设施和公寓之间的匹配(id_apartment / id_amenity)(表格名称为apar_amen)。 要检索信息,您将查询将其连接到其他两个表的最后一个表:

SELECT apartments.*, amenity_name FROM apar_amen 
JOIN apartments ON apar_amen.id_apartment = apartments.id 
JOIN amenities ON apar_amen.id_amenity=amenities.id_amenity
WHERE amenity_name = '1' //where 1 = 'Cable' in amenities list

通过这种方式,您可以根据需要添加任意数量的设施,更改名称,并根据需要为任何公寓提供尽可能多的记录。这样链接只能通过id进行,如果你更改了#34; Cable"到有线电视"例如,因为" Cable"只是一个标签而不是列名。