Внешний ключ для многих ко многим отношениям в SQL - PullRequest
1 голос
/ 03 апреля 2019

У меня есть таблица SQL под названием Listing, которая представляет дома, которые были арендованы.В таблице есть первичный ключ 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);

Myпроблема заключается в том, что мне нужно связать эти две таблицы с внешним ключом, и я не знаю, как, поскольку отношения между ними являются отношениями многих ко многим.Я проверял другие вопросы, касающиеся внешних ключей во многих отношениях, но не смог найти ничего похожего.Если есть что-то подобное, пожалуйста, объясните, как это похоже на мой вопрос.

1 Ответ

3 голосов
/ 03 апреля 2019

Вы должны создать еще один стол, в котором будут храниться отношения 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     |
+----------+------------+

Итак, в доме Дядя Боб есть только телевизор, а в доме Мама Сара есть телевизор, интернет и полностью оборудованная кухня.

Помните - вы никогда не должны использовать один и тот же столбец для хранения нескольких значений (разделенных запятой). Во всех таких случаях вам нужно использовать другую таблицу, преобразуя несколько разделенных запятыми значений в отдельные строки внутри этой таблицы подробностей и ссылаясь на первичный ключ основной таблицы.

...