电影关系数据库设计

时间:2014-03-25 12:15:49

标签: mysql database relational-database

我正在创建一个电影信息数据库,但坚持设计1个电影与其他电影之间的关系表。

例如:复仇者联盟是复仇者联盟2的前传,但是我应该在我的数据库中存储反向关系(续集)吗?我应该把关系分成独立的表吗?目前我有3个替代方案,但这是设计数据库的最佳实践吗?

备选方案1:在关系映射

中存储了两对关系
Movies: id, title, ...
Relation_maps: id, movie_id, related_movie_id, relation_text, reverse_relation_text  

所以,如果我有2部电影:复仇者联盟和复仇者联盟2.我将有一个关系映射与“前传”的relation_text和“续集”的反向关系文本

备选方案2:将关系拆分为分隔表并将反向关系存储为表本身的ID

Movies: id, title, ...
Relation_maps: id, movie_id, related_movie_id, relation_id
Relations: id, reverse_relation_id (self-refer to id), relation_text

关系文本将存储在另一个表中,反向关系存储为自引用id。所以在关系表中,它会变成这样:

  id | reverse_relation_id | relation_text
  1  | 2                   | prequel
  2  | 1                   | sequel

备选方案3:通过条件代码显示分离关系到分离表和反向关系

Movies: id, title, ...
Relation_maps: id, movie_id, related_movie_id, relation_id
Relations: id, relation_text

与替代2相同,除了反向关系将通过视图代码中的条件语句显示。如果这更好,我应该真正拆分关系文本还是将它组合在relation_maps表中?

在性能和最佳实践方面有没有更好的选择?提前谢谢。

1 个答案:

答案 0 :(得分:0)

也许是这样的:

Relations

id        name
 1        Star Wars


Relations_Detail

relation_id  movie_id   relation_type    sequence
          1        40   prequel                 0
          1        50   prequel                 1
          1        60   prequel                 2
          1        10   debut                   3
          1        20   sequel                  4
          1        30   sequel                  5

您将拥有(relation_id,movie_id)的多列主键。