MySQL 建模:关系规范化和戒指问题

MySQL Modeling: Relationship normalization & ring issue

我正在建立这个 MySQL 模型来组织电影 collection。 它将管理电影和 series/episodes。每个 movie/episode 可能有一个或多个音频流,audio/video 的编解码器可能会有所不同。 (暂时不要介意字幕)

我不是专家,所以我正在寻求建议:

已更新 根据 ABrowne 的回答建模:

"for a tv serie that is drama, you won't have an episode that is comedy"

更新 根据 ABrowne 的回答建模:

回答你的第一个问题,'ring relationships' 你提到的它们既不正确也不正确,但确实暗示了一种复杂的关系。

在你描述的关系中,电影 'could have' 一个或多个编解码器和一个编解码器 'could have' 一个或多个剧集。假设我们的电影是 'Ironman',它可以用 H.264/MPEG-4 和 MPEG-4 ASP 编码。所以这个关系看起来是正确有效的。剧集也可以编码为 H.264/MPEG-4,并且单个编码(distribution/media,比如 DVD,也许?)可能包含多个剧集。也许我误解了你的'codec',所以如果我错了请指正。这将在编解码器和剧集之间创建多对多关系,中间缺少一个 table,称为 'distribution/media'。

还有 movie_audios,我假设您指的是 episode/movie 所讲的不同语言音频?

我会考虑规范化你的结构并考虑这样的事情(这只是一个框架):

video
- video_id
- plot
- fk_series_id
- series_no   <- this is the number within a series
- rating
- imdb_ref
- fk_genre_id    
- fk_codec_id  <- 1 to many relationship between codec and video

video_genre
- fk_video_id
- fk_genre_id

genre
- genre_id
- name

subtitles    
- fk_video_id 
- fk_language

audio
- audio_id
- fk_video_id
- fk_language_id

language
- language_id    

audio_codec
- fk_audio_id
- fk_codec_id

codec
- codec_id
- name

series
- series_id
- series_name
- fk_series_type_id

series_type
- series_type_id
- name

关于你关于当前编解码器关系的多个 id 的问题的第二部分,困难在于你如何查找它。

例如,假设您有 movie_id = 9,而您的 episode_id = 9,是电影还是剧集?您可以通过以下几种方式解决此问题:

1) 把两个外键放到codec上,用xor判断是否存在关系

2) 你可以在编解码器table上添加一个'type'。这将需要您的插入方法以确保它被正确应用

3) 您可以确保您的 ID 在两个 table 中都是唯一的。一种复杂的方法是在生成 id 时对两者进行查找。您甚至可以在插入时创建一个触发事件,但更简单的方法是在 id 前加上一个字母,这样 m9 就是一部电影,而 e9 就是一集。

----更新post模型更新----

所以阅读关系和 tables,它们似乎是我想象的那样。 movie/episode(我们称之为录音)可以有多种类型,例如浪漫和喜剧。然而,有一种喜剧类型。从这一流派中我们可以正确找到它相关的所有录音。

一个录音可以有很多音频,也可以有很多字幕。每个音频和每个字幕都是一种语言。音频也有一个音频编解码器。从一种语言或一种编解码器我们可以找到它相关的所有录音。

一个录音也有一个视频编解码器,一个tv_series有很多录音。

我会重新考虑您对 'movies' 的命名,因为它能够更笼统地涵盖所包含的内容,例如视频或录音。

另外我会考虑您是否需要在一个系列中列出电影,例如 Ironman 1-3。这将再次质疑 tv_series 的命名是否更通用。

为了简化您的模型,您可以将编解码器视频和音频合并为一个。如果您需要区分,您可以在其上放置一个类型字段,或者与 codec_type table 的关系。