【发布时间】:2014-03-25 20:54:09
【问题描述】:
我正在创建一个电影信息数据库,但一直在设计一部电影与其他电影之间的关系表。
例如:复仇者联盟是复仇者联盟 2 的前传,但我应该将反向关系(续集)存储在我的数据库中吗?我应该把关系分成单独的表吗?目前我有 3 种选择,但哪一种才是设计数据库的最佳实践?
方案一:两个表,关系映射中存储有一对关系
Movies: id, title, ...
Relation_maps: id, movie_id, related_movie_id, relation_text, reverse_relation_text
所以,如果我有 2 部电影:复仇者联盟和复仇者联盟 2。我将有一个关系映射,其关系文本为“前传”,反向关系文本为“续集”
备选方案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表中?
在性能和最佳实践方面是否有更好的选择?提前致谢。
【问题讨论】:
标签: mysql database relational-database