我正在创建一个电影信息数据库,但坚持设计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表中?
在性能和最佳实践方面有没有更好的选择?提前谢谢。
答案 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)的多列主键。