这是我对stackoverflow的第一个问题,所以如果我做错了,请告诉我,我会尽快解决。
所以我正在尝试为Tv Shows创建一个数据库,我想知道最好的方法,并使我当前的数据库更简单(规范化)。
我将能够拥有以下结构或类似结构。
Fringe
Season 1
Episodes 1 - 10(whatever there are)
Season 2
Episodes 1 - 10(whatever there are)
... (so on)
Burn Notice
Season 1
Episodes 1 - 10(whatever there are)
Season 2
Episodes 1 - 10(whatever there are)
... (so on)
... (More Tv Shows)
对不起,如果这似乎不清楚。 (请要求澄清)
但我现在拥有的结构是3张桌子(tvshow_list,tvshow_episodes,tvshow_link)
//tvshow_list//
TvShow Name | Director | Company_Created | Language | TVDescription | tv_ID
//tvshow_episodes//
tv_ID | EpisodeNum | SeasonNum | EpTitle | EpDescription | Showdate | epid
//tvshow_link//
epid | ep_link
董事和公司通过身份证与另一张表格挂钩,并附上公司和董事名单。
我很确定有一种更简化的方法。
提前感谢您的帮助,
Krishanthan Lingeswaran
答案 0 :(得分:1)
规范化的基本概念是,您应该只存储您拥有的任何数据项的一个副本。看起来你已经有了一个好的开始。
通过剧集和节目,您可以通过两种基本方式来模拟您要尝试的内容。在数据库世界中,我们可能听说过“一对多”或“多对多”这一术语。两者都很有用,只需要根据您的具体情况知道哪个是正确的使用方法。在你的情况下,问自己的一个大问题是,一集只能属于一个节目,还是一集可以同时属于多个节目?我将解释这两种形式,以及为什么你需要知道这个问题的答案。
第一种形式只是外键关系。如果你有两个表,'剧集'和'节目',在剧集表中,你将有一个名为'show_id'的列,其中包含一个(并且只有一个!)节目的ID。你能看到你怎么可能永远不会有这样的剧集属于多个节目?这被称为“一对多”关系,即节目可以有很多集。
第二种形式是使用关联表,这是您在示例中使用的表单。此表单允许您将一集与多个节目相关联,因此称为“多对多”关系。
使用第一种形式有一些好处,但在大多数情况下,这并不是什么大不了的事。您的查询会稍微缩短一点,因为您只需加入2个表来获取剧集 - >节目,但另一个表只是一个连接。这真的归结为要弄清楚你是否需要“一对多”或“多对多”的关系。
您需要多对多关系的情况的一个示例是,如果您正在建模库并且必须跟踪谁检查了哪本书。你有一个书籍表,一个用户表,然后是一个“用户书籍”的表格,它有一个id,一个book_id和一个user_id,并且是一个多对多的关系。
希望有所帮助!
答案 1 :(得分:1)
我很确定有更简单的方法可以做到这一点。
据我所知。您的架构接近最简单的方法,因为我认为这是您要求的功能。对它的“改进”实际上只会使它变得更加复杂,并且应该在您判断需要出现时添加。我想到了以下示例(其中没有一个真正简化您的架构)。
shows.id, episodes.id, episodes.show_id, link.id, link.episode_id
。SeasonNum
置于Episodes表格中的int
,违反了规范化约束。这不是一个严重的违规行为,但如果你真的想坚持下去,我会创建一个单独的Seasons表并将它多对一地关联到Shows表,然后让Episodes只与Seasons联系。例如,这使您有机会将信息附加到每个季节。此外,它防止重复信息(虽然Episodes表中季节ID外键列的类型表面上仍然是INT,外键哲学上存储一个关联,你想要什么,与哑数据,你有什么)。 关于所有这些建议的底线:选择适合您项目的内容。如果您不需要此级别关联所提供的功能,并且您不介意手动输入重复数据(您可能最终会实现一个自动完成系统来帮助您),您可以掩盖一些规范化约束
标准化只是一个建议。选择适合自己的东西并从错误中吸取教训。