【问题标题】:which is the best option, ternary relation or two binary?哪个是最好的选择,三元关系还是二元关系?
【发布时间】:2013-04-22 01:30:55
【问题描述】:

我的简单例子可以是这样。我有电影桌,电影有导演和演员。在我的数据库中,一部电影可以有一个或多个导演和一个或多个演员。我还有一个表格 Persons ,其中包含人员的信息。所以一个人可以在电影中扮演不同的角色,我有其他表可以扮演角色,表 Roles。

在很多情况下,我有兴趣了解电影的导演或演员,因此我可以通过两种主要方式来分配表格。

第一个选项:三元关系:

Movies(IDMovie, ...)
Persons(IDPerson, ...)
Roles(IDRol,...)
MoviesPersons(IDMovie, IDPerson, IDRol...)

在这种情况下,我使用三元关系。

第二个选项是:

MoviesDirectors(IDMovie, IDPerson,...)
MoviesActors(IDMovie, IDPerson,...)

在这种情况下,我可以从关系表中推断出角色。

哪个是最好的选择?

谢谢。

编辑:如果我使用两个二元关系的选项,如果将来,如果我想要配乐的作曲家,我需要创建一个新的表和关系,但是,我不使用三元关系'不需要做任何事情,只需在表 Roles 中添加一个新角色和其他任何内容。

在性能上两个二元关系比一个三元关系更好?

谢谢。

【问题讨论】:

    标签: database database-design


    【解决方案1】:

    哪个是最好的选择?

    您几乎回答了您自己的问题 - 如果您希望将来灵活地添加新角色而不改变数据库的结构,那么三元关系就是要走的路。

    如果它们中的每一个都需要具有不同的字段或约束,我会考虑单独的二元关系(根据您的描述,情况似乎并非如此)。

    在性能上两个二元关系比一个三元关系更好?

    由于表示三元关系的表需要物理存储角色标识符(与从表名本身推断角色的二元关系相反),您的缓存使用率会稍微变差。

    但是,通过对复合 PK 中的字段进行仔细排序,可以使三元关系更适合某些类型的查询。例如,PK:{IDMovie, IDRol, IDPerson} 可以有效地支持以下查询:

    • 哪些人参与过给定的电影?(X)
    • 哪些人曾以特定角色参与过特定电影?

    如果您在{IDPerson, IDRol, IDMovie} 上创建索引,您还可以有效地查询:

    • 给定的人参与过哪些电影?(X)
    • 给定的人在给定的角色中参与过哪些电影?

    (X) 使用单独的二元关系,您需要查询每个联结表。这当然不是只有两张表的问题,但可以随着表的数量增加(当然从维护甚至从性能角度)变成一张。

    【讨论】:

      猜你喜欢
      • 2017-01-08
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 2016-05-21
      • 2023-04-07
      • 2011-06-21
      • 1970-01-01
      • 2017-09-20
      相关资源
      最近更新 更多