6

我正在设计一个电影编目器,它将依赖 SQL 数据库来存储数据。我不是数据库设计专家,老实说,除了基本的数据库查询之外,我对其他任何事情都没有那么老练。我的问题是进行以下操作的最有效方法是什么。

我目前创建了 5 个表

Movies
------
[id] integer
[title] nvarchar(100)
[duration] integer
[year] datetime

People
------
[people_id] integer
[person] nvarchar(100)

Writers
-------
[id] integer
[people_id] integer

Directors
---------
[id] integer
[people_id] integer

Actors
------
[id] integer
[people_id] integer

基本上使用联结表的多对多关系,电影->作家<-人物,电影->导演<-人物,最后是电影->演员<-人物。People 表是从中提取每个角色所需数据的池。由于一个人可以同时是电影中的导演和明星,作家和导演,甚至三个角色,我相信 3 个连接表可以解决这个问题。自然,一个人也可以出现在许多电影中。所以我认为这是做到这一点的方法。

我通过几篇网络文章阅读了建立多对多关系的内容,并且阅读的越多,我对如何设置这种情况就越感到困惑。大多数只是处理一个领域或使用作者/书籍类比,这无助于我理解如何实现我的情况。

如前所述,我的问题是,这是一种有效的方法吗?甚至是正确的?

我希望能够轻松地查询一部电影,并将与它相关的所有信息都输出到一个表单中。

谢谢-Res

4

5 回答 5

1

不要创建单独的表,创建一个像PeopleRolescontains'Actor'等的新表'Director',然后创建一个关系表来同时连接电影、人物和角色:

Movies
------
[id] integer
[title] nvarchar(100)
[duration] integer
[year] datetime

People
------
[people_id] integer
[person] nvarchar(100)

PeopleRoles
-----------
[role_id] integer
[name] nvarchar(100)

MovieCollaborators
------------------
[id] integer
[people_id] integer
[movie_id] integer
[role_id] integer

您将获得灵活性,并且能够通过单个JOIN.

于 2013-01-26T23:20:19.153 回答
0

如果事情仍然如此简单,您应该使用包含“角色”列的单个连接表的其他答案中建议的模型。

但是,您可能希望开始向模型中添加仅适用于某些角色的内容。例如,演员是主角、配角还是客串?在这种情况下,您在问题中描述的模型更好。你的模型的缺点是,如果你想以一种通用的方式处理电影中的参与,你需要将UNION很多表放在一起。

这是一个权衡。具有角色列的单个连接表可以更容易地对角色进行一般处理。为每个角色使用单独的连接表可以更轻松地区别对待它们。

于 2013-01-27T07:14:39.143 回答
0

我建议将作家、导演和演员放在一张桌子上。

在此处输入图像描述

于 2013-01-27T05:32:25.873 回答
0

您正在模拟继承,但您的派生类型没有任何不同的字段,因此,您不妨将它们全部放在一个表中并有一个标识符列来指示它们的类型。

此建模问题的另一个复杂部分是您可以让同一个人担任多个角色,例如 Write、Direct、Star。我认为您需要介绍角色的概念。然后链接到角色而不是人。角色类是多对多模型中的常见特征。

于 2013-01-26T23:18:03.600 回答
0

而不是您建议的三个多对多表,最好有一个表 movie-people,它将包含三列:MovieId、peopleId、roleType

通过 roleType(actor, director, writer) 你会知道这个人的角色

于 2013-01-26T23:18:43.550 回答