sql多对多关系表

8hhllhi2  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(290)

我试图在这两张table之间建立一个多对多的关系。

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)
   );
qlzsbp2j

qlzsbp2j1#

你的table看起来不对劲。
首先,在actors表中有一个外键引用该系列,这基本上违背了bridge表的目的。
另外,从桥接表到参与者的外键的格式也不好:每列有一个键,而应该有一个唯一的多列键来引用参与者。我建议使用自动递增的主键,而不是使用这些列的组合。这为您的设计提供了更大的灵活性(在现实生活中,两个不同的系列可能具有相同的标题),并使在桥接表中创建外键变得更容易。
考虑:

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)
)

相关问题