sql - sql中多对多关系的外键

标签 sql database postgresql data-modeling

我有一个名为 Listing 的 SQL 表,它代表已出租的房屋。该表有一个主键 id 和另一个名为 amenities 的字段,其中包含每间房屋必须提供的东西。每栋房屋的设施彼此之间用逗号分隔。例如电视、互联网、浴室

我使用以下命令创建了一个名为 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);

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

最佳答案

您必须创建另一个表来保存房屋与其设施之间的一对多关系。

所以你的 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     |
+----------+------------+

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

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

关于sql - sql中多对多关系的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55499797/

相关文章:

sql - 将多个选择和更新子句截断为一个子句

mysql - 在 MySQL 中用 1 个键查询 2 个以上的表?

php - 用户未在 phpmyadmin localhost DB 中注册

database - 微软 Access : programmatically rename columns

sql - Rails 4 where 并使用自定义函数选择查询

mysql - 如何使用另一个查询结果过滤MySQL表

java - 查询以获取最近日期的记录

c# - 从具有字符串值的列中删除坏字符

mysql - 如何在 sql 中编写子查询以映射字典值

postgresql - Knex Raw 使用变量选择 Postgresql