【问题标题】:Somewhat complicated database design for movie collection/library, need guidance电影收藏/图书馆的数据库设计有些复杂,需要指导
【发布时间】:2012-10-28 14:15:07
【问题描述】:

我的数据库有点生疏,但也许你可以帮忙。我想创建一个表,其中包含在 DVD 和蓝光上购买的电影。如您所知,有些 DVD 盒子包含多部电影,盒子中的每部电影都可以是特别版,例如导演剪辑版等。您的收藏/库中可以同时拥有单部电影和盒子。

如何构建这个?我不记得正确的符号,但这里是:

movies(_id, title, year)
boxes(_id, title, format)
movies_in_box(_*movie_id, _*box_id, edition)
collections(_*user_id, _*id [references either movies or boxes], _type [enum for movie or box], edition, format)

_ = primary key, * = foreign key

这有意义吗?

【问题讨论】:

    标签: database-design


    【解决方案1】:

    您的层次结构以集合开始,该集合代表属于用户的所有项目。一个项目可以是一部独立的电影,也可以是一套盒装,它本身包含几部电影。我认为“格式”字段应该属于电影而不是盒子(您可能在同一个盒子里有一张 dvd 和一张蓝光)。

    “版本”字段似乎有些多余,但我认为这并不重要。如果你可以解决你有一个外键 - _*id - 在引用电影或盒子的集合表中的事实,那么结构是好的,但我认为最好代表 every 电影作为一个盒子设置,即使盒子只包含一部电影。那么你的结构将是

    USERS
    user_id (PK)
    username
    
    MOVIES
    movie_id (PK)
    movie_name
    year
    format
    
    BOXES
    box_id (PK)
    box_name
    edition (I assume that this includes the year) 
    
    BOXCONTENTS
    box_id (PK, FK)
    movie_id (PK, FK)
    
    COLLECTIONS
    user_id (PK, FK)
    box_id (PK, FK)
    

    【讨论】:

    • 我喜欢你的设计,如果我可以将MOVIES.formatBOXES.edition 移动到BOXCONTENTS。您说得对,在极少数情况下,一个盒子可能同时装 DVD 和蓝光,但一个盒子也可以只装一部电影的特别版。我可能应该将名称 BOXES 更改为更合适的名称,但我理解您的结构并同意它。
    • 此外,格式是预定义的值(DVD、蓝光、VHS、Betamax、iTunes 等),所以我正在考虑使用枚举,但版本可以是常规版本(特别版、导演剪辑版等)也可以自定义,比如超棒版。我最好的选择是什么:varchar 或另一张桌子?
    • 单部电影也会有一些冗余,因为它们的标题以相同的方式输入两次:MOVIESBOXES
    • @Viktor:关于您对格式和版本的评论。枚举和表之间的选择取决于人们期望看到的变化量。一旦电影仅在 Betamax 上可用 - 但随后它在 VHS、DVD 等上可用。每次出现新格式时,拥有表格的情况就变得越强,因为在表格中添加格式不需要更改在数据库结构中。这(一张表)可能也是最好的版本,因为它们的名称不太标准化。
    猜你喜欢
    • 2010-10-01
    • 2015-10-22
    • 1970-01-01
    • 2020-10-03
    • 2020-09-16
    • 2016-07-02
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多