【问题标题】:Foreign key for many to many relationship in sqlsql中多对多关系的外键
【发布时间】:2019-08-25 06:09:33
【问题描述】:

我有一个名为 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】:

您必须创建另一个表来保存房屋与其设施之间的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     |
+----------+------------+

所以 Uncle Bob 房子只有电视,而 Mom Sara 房子有电视、互联网和设备齐全的厨房。

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

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 2020-06-07
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    相关资源
    最近更新 更多