我有一个名为Listing
的SQL表,它表示已租用的房屋。该表具有一个主键id
和一个名为amenities
的字段,其中包含每个房屋必须提供的内容。每个房子的设施都以逗号分隔。例如TV, Internet, Bathroom
。
我使用以下命令创建了一个名为Amenity的表,其中提供了所有独特的不同便利设施,每个便利设施的编号为SERIAL
。
CREATE TABLE Amenity AS(
SELECT DISTINCT regexp_split_to_table(amenities,',') FROM Listing
);
ALTER TABLE Amenity
RENAME regexp_split_to_table to amenity_name;
ALTER TABLE Amenity ADD COLUMN amenity_id SERIAL;
ALTER TABLE Amenity ADD PRIMARY KEY(amenity_id);
我的问题是我需要用外键连接这两个表,但由于它们之间的关系是多对多关系,所以我不知道如何。我在多对多关系中检查了有关外键的其他问题,但找不到类似的问题。如果存在类似的内容,请说明与我的问题类似的方式。
答案 0 :(得分:2)
您必须创建另一个表,该表将容纳房屋及其设施之间的one-to-many
关系。
所以您的3张桌子看起来像这样:
Table HOUSE
+----------+------------+
| house_id | house_name |
+----------+------------+
| 1 | Uncle Bob |
+----------+------------+
| 2 | Mom Sara |
+----------+------------+
Table AMENITIES
+------------+--------------+
| amenity_id | amenity_name |
+------------+--------------+
| 1 | TV |
+------------+--------------+
| 2 | Internet |
+------------+--------------+
| 3 | Kitchen |
+------------+--------------+
Table HOUSE_AMENITIES
+----------+------------+
| house_id | amenity_id |
+----------+------------+
| 1 | 1 |
+----------+------------+
| 2 | 1 |
+----------+------------+
| 2 | 2 |
+----------+------------+
| 2 | 3 |
+----------+------------+
所以房子鲍勃叔叔只有电视,而房子妈妈萨拉有电视,互联网和设备齐全的厨房。
请记住-绝对不要使用同一列存储多个值(用逗号分隔)。在所有这些情况下,您都必须使用另一个表,将多个逗号分隔的值转换为该明细表内的不同行,并引用主表的主键。