SQL таблица отношений многие ко многим - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь установить связь «многие-ко-многим» между этими двумя таблицами.

CREATE TABLE series (
    title VARCHAR(30),
    language VARCHAR(30),
    year INT,
    PRIMARY KEY (title)
);

CREATE TABLE actors (
    name VARCHAR(30),
    age INT,
    country VARCHAR(30),
    serie VARCHAR(30),
    PRIMARY KEY (name , age , country , serie),
    FOREIGN KEY (serie)
        REFERENCES series (title)
);

Я попытался создать отдельную таблицу, чтобы сформировать отношение «многие ко многим». Это правильно?

CREATE TABLE series_actors_combined (
    title VARCHAR(30),
    name VARCHAR(30),
    age INT,
    country VARCHAR(30),
    serie VARCHAR(30),
    FOREIGN KEY (title)
        REFERENCES series (title),
    FOREIGN KEY (name)
        REFERENCES actors (name),
    FOREIGN KEY (age)
        REFERENCES actors (age),
    FOREIGN KEY (country)
        REFERENCES actors (country),
    FOREIGN KEY (serie)
        REFERENCES actors (serie)
   );

1 Ответ

2 голосов
/ 28 мая 2020

Ваши таблицы не выглядят правильно.

В качестве стартера у вас есть внешний ключ в таблице участников, который ссылается на серию, что в основном сводит на нет цель таблицы моста.

Кроме того, внешние ключи из таблицы мостов для акторы имеют неправильный формат: у вас есть один ключ на столбец, в то время как у вас должен быть уникальный ключ из нескольких столбцов для ссылки на актера. Я бы порекомендовал использовать автоматически увеличивающиеся первичные ключи вместо использования этих комбинаций столбцов. Это дает больше гибкости вашему дизайну (в реальной жизни две разные серии могут иметь одинаковый заголовок) и упрощает создание внешних ключей в таблице моста.

Считайте:

create table series(
    id int primary key auto_increment,
    title varchar(30) unique,
    language varchar(30), 
    year int
);

create table actors(
    id int primary key auto_increment,
    name varchar(30), 
    dob date,     -- better than age 
    country varchar(30)
);

create table series_actors(
    series_id int references series(id),
    actor_id int references actors(id),
    primary key (series_id, actor_id)
)
...