我在db中有一张公寓列表,每个公寓都有设施。
我用来保存公寓列表中的设施,但这是一个问题,因为有时我需要添加/编辑设施,没有设施的公寓会占用不必要的字段。
表格如下(有更多便利设施):
+----+---------+---------+-------+------+
| id | Address | Doorman | Cable | Pets |
+----+---------+---------+-------+------+
| 1 | E 55th | 1 | 0 | 1 |
| 2 | E 72th | 0 | 1 | 1 |
+----+---------+---------+-------+------+
我可以用哪种方式存储这类数据?
可能正确的方法是将设施存放在不同的桌子上,但是我如何按设施查询公寓?
现在查询我做Select * from table where Cable=1
答案 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"只是一个标签而不是列名。