SQL中多对多关系的外键

时间:2019-04-03 16:16:36

标签: sql database postgresql data-modeling

我有一个名为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);

我的问题是我需要用外键连接这两个表,但由于它们之间的关系是多对多关系,所以我不知道如何。我在多对多关系中检查了有关外键的其他问题,但找不到类似的问题。如果存在类似的内容,请说明与我的问题类似的方式。

1 个答案:

答案 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     |
+----------+------------+

所以房子鲍勃叔叔只有电视,而房子妈妈萨拉有电视,互联网和设备齐全的厨房。

请记住-绝对不要使用同一列存储多个值(用逗号分隔)。在所有这些情况下,您都必须使用另一个表,将多个逗号分隔的值转换为该明细表内的不同行,并引用主表的主键。