MySQL 建模:关系规范化和戒指问题
MySQL Modeling: Relationship normalization & ring issue
我正在建立这个 MySQL 模型来组织电影 collection。
它将管理电影和 series/episodes。每个 movie/episode 可能有一个或多个音频流,audio/video 的编解码器可能会有所不同。 (暂时不要介意字幕)
我不是专家,所以我正在寻求建议:
环关系。
很久以前有人告诉我,当一个模型有'ring'关系时,也就是说模型中的关系形成了ring/loop(如图),那么建模很可能是错误的。这是错误的吗?
多次引用:table movies_audios
在这个 table 中,fk_movie_id
可能指的是 movies.movie_id
或 episodes.episode_id
。这个可以吗?我的意思是一个主键可能引用不同的 tables?
已更新 根据 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 的关系。
我正在建立这个 MySQL 模型来组织电影 collection。 它将管理电影和 series/episodes。每个 movie/episode 可能有一个或多个音频流,audio/video 的编解码器可能会有所不同。 (暂时不要介意字幕)
我不是专家,所以我正在寻求建议:
环关系。 很久以前有人告诉我,当一个模型有'ring'关系时,也就是说模型中的关系形成了ring/loop(如图),那么建模很可能是错误的。这是错误的吗?
多次引用:table
movies_audios
在这个 table 中,fk_movie_id
可能指的是movies.movie_id
或episodes.episode_id
。这个可以吗?我的意思是一个主键可能引用不同的 tables?
已更新 根据 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 的关系。