为电视节目创建数据库的方法

时间:2010-11-26 17:36:38

标签: mysql mysql-management

这是我对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

2 个答案:

答案 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,外键哲学上存储一个关联,你想要什么,与哑数据,你有什么)。
  • 您可以考虑将语言,导演和公司放在他们自己的桌子而不是电视节目列表中。这与上述问题相同,在您的情况下是对规范化的轻微违反。
  • 语言,导演和公司都有关于协会级别的有趣问题。大多数电视节目都有不同的导演用于不同的剧集。许多是由多种语言和几个不同的公司,有时是网络生产的。那么您打算在什么级别存储这些信息?我不是软件架构师,所以其他人可以比我更好地回答这个问题,但是我为语言,导演和公司建立了多态的多对多关联,并且允许这些值的继承模型在逐集,逐季或逐个节目的基础上指定,如果没有提供,则继承父母的价值。

关于所有这些建议的底线:选择适合您项目的内容。如果您不需要此级别关联所提​​供的功能,并且您不介意手动输入重复数据(您可能最终会实现一个自动完成系统来帮助您),您可以掩盖一些规范化约束

标准化只是一个建议。选择适合自己的东西并从错误中吸取教训。