在sql中有多对多关系的外键

问题描述 投票:0回答:1

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

我的问题是我需要用外键连接这两个表,我不知道它们之间的关系是多少关系。我已经检查了很多关系中有关外键的其他问题,但找不到类似的东西。如果存在类似的东西,请解释它与我的问题类似的方式。

sql database postgresql data-modeling
1个回答
3
投票

你必须创建另一个表,它将保持房屋与其设施之间的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     |
+----------+------------+

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

请记住 - 您不应该使用相同的列来存储多个值(用逗号分隔)。在所有这些情况下,您必须使用另一个表,将多个逗号分隔值转换为此详细信息表中的不同行,并引用主表的主键。

© www.soinside.com 2019 - 2024. All rights reserved.