【问题标题】:Proper or efficient way of designing multiple many-to-many relationships stemming from a single table设计源自单个表的多个多对多关系的正确或有效方法
【发布时间】:2013-01-10 15:23:43
【问题描述】:

我正在设计一个依赖 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

基本上使用联结表的多对多关系,电影->作家导演演员

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

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

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

谢谢 -Res

【问题讨论】:

  • 这是正确的设计,尤其是当您稍后添加在WritersDirectorsActors 之间不同的字段或约束时。 OTOH,如果您留下 3 个具有相同字段/约束的联结表,您也可以将它们合并到一个表中,类似于已经提出的一些答案。

标签: sql database-design many-to-many


【解决方案1】:

不要创建单独的表,创建一个新表,例如 PeopleRoles,其中包含 '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轻松地从电影中获得所有合作者。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      通过roleType(演员、导演、编剧)你会知道这个人的角色

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2019-12-30
            • 2018-10-20
            • 1970-01-01
            • 1970-01-01
            • 2012-07-12
            • 2021-09-24
            • 2011-05-03
            • 1970-01-01
            • 2018-01-25
            相关资源
            最近更新 更多