我正在制作一个关于电影的网站,我想在电影和演员(导演、编剧和演员)之间建立关系,有两种可能性可以实现这一点,第一个是创建每个演员的表格:
CREATE TABLE director(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));
CREATE TABLE writer(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));
CREATE TABLE actor(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));
Run Code Online (Sandbox Code Playgroud)
并在每个表和电影表之间建立多对多关系。
第二种可能性是为演员表创建一个带有类型列的表,该列可以引用导演、作家或演员,并在该表和电影表之间建立多对多关系。
CREATE TABLE cast(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), type varchar(10));
Run Code Online (Sandbox Code Playgroud)
注意:对于演员,自动生成表将有一些附加列:character_name、role...
那么对于这种情况哪种可能性更好?
两种方法都忽略了演员、导演、作家或……(通常)是一个人。那是实际的实体。一个人在电影中扮演的角色(演员、作家……)实际上是一种关系属性。
这两种方法都会出现裁员。如果某人在一部电影中扮演多个角色,例如导演和表演(想想希区柯克的客串),那么这个人就会有两个记录。这些在第一种方法中分布在两个表中,在第二种方法中分布在一个表中。一个人的属性(如姓名等)将被存储两次,并且可能相互矛盾,或者如果它们发生变化,则需要在两个地方进行更改,等等。
所以我建议第三种方法:为人们建立一个表,存储一个人可以拥有的所有属性(姓名,...)。并有一个将人们与电影联系起来的表格,还表明一个人在电影中扮演的角色(演员、导演……)。
为角色准备一张桌子可能也是一个不错的主意。
例如:
CREATE TABLE people
(id integer AUTO_INCREMENT,
name varchar(50),
PRIMARY KEY (id));
CREATE TABLE roles
(id integer AUTO_INCREMENT,
name varchar(10),
PRIMARY KEY (id));
CREATE TABLE movies_people
(movie integer,
person integer,
role integer,
PRIMARY KEY (movie,
person,
role),
FOREIGN KEY (movie)
REFERENCES movies
(id)
ON DELETE CASCADE,
FOREIGN KEY (person)
REFERENCES people
(id),
FOREIGN KEY (role)
REFERENCES roles
(id));
Run Code Online (Sandbox Code Playgroud)
小智 4
我会采用第二种方法。它甚至符合标准的 SQL 规则。
如果您的演员类型(导演、编剧等)还有一些附加属性(列),您可以进行一些修改。在这种情况下,建议将它们作为主表的子表。
在你的情况下,主表将是“cast”。它会有 ID 和其他列。将创建其他表并对应不同的演员表,例如表:“导演”、“编剧”……然后在每个子表之间与主“演员”表建立 1-1 关系。该关系在子表上是强制性的(意味着例如“导演”在创建时必须具有与“演员”的关系)。在关系意义上,“导演”的外键也是它的主键,并且它暗示“演员”的主键。
建议使用此方法,因为您不仅可以向不同的演员添加附加列,还可以向其他关系添加其他关系,以防您以后想要扩展数据库。您还可以添加“cast”的其他子表,而无需更改与“movies”表相关的结构。