将相似的数据拆分到两个表中?

Split similar data into two tables?

我有两组几乎相同的数据,一组是书籍,另一组是电影。

所以我们有这样的东西:

等等

两组数据的唯一区别是 Books 有一个 ISBN 字段,而 Movies 有一个 Budget 字段。

我的问题是,即使数据相似,也应该合并为一个 table 还是应该分开两个 table?

我在 SO 上看过类似的问题,但之所以问,是因为大多数时候我的应用程序需要获取书籍和电影的单一列表。很难得到书或电影。因此,如果数据被拆分为两个 table,我需要为大多数查询查找两个 table。

您必须非常确定您的申请 requests/features 的未来。

我无法想象您存储的与电影相关联的书籍类型,因此很多电影的标题与所依据的书籍不同。示例:25 films that changed the name.

如果您确定您的数据将持久存在并且对于书籍和电影始终相同,那么您可以创建新的 table 例如 Productions 并在其中存储标题、价格、图像、发布日期,发布。然后你可以将 Production 实体的外键存储在你的 tables BooksMovies.

但如果将来发生任何意外,您将需要重建结构或改变您的假设。但无论如何,使用实体 Production 会更容易。然后您只需创建具有修改值的新行并分配给选定的 BookMovie.

书籍和电影的 table 解决方案是最糟糕的,因为如果其中一个参数消失,您将添加新行并且您将获得第一组数据(真实书籍和 non-existing 电影)和第二套(non-existing 书籍和真实电影)。

当然一切都在条件下,将来可能会发生变化。如果您 100% 确定,那么 1 table 就足够了,但从数据库规范化的角度来看并不正确。

我会亲自为书籍和电影创建单独的 table。

The only difference between the two sets of data is that Books have an IBAN field and Movies has a Budget field.

  • 你确定你现在的这个差距不会 扩展到您可能必须考虑的其他差异 以后呢?

  • 您确定您将不必处理任何其他类型的 未来的实体(书籍和电影除外) 让事情复杂化?

如果两个问题的答案都是 "Yes" 那么您可以使用 1 table.
但是如果我必须设计这个,我会为每个实体保留一个单独的 table。
如果需要,可以很容易地将他们的数据合并到一个视图中。
不容易的是在 table 中添加或修改列,甚至命名它们,只是为了满足 2 个或更多实体的要求。

完成这项工作——对书籍和电影进行编目——是几辈子的工作。不要追求完美,因为你可能永远达不到。查看 Worldcat.org 以获得出色的编目示例。就两个:

我的建议:添加一个table 称为元数据。您的 titles table 应该与您的 metadata table.

具有一对多关系

然后,例如,titles可能包含

title_id     title                                  price      release  
103          Designing Data-Intensive Applications  34.96      2017
104          Coco                                   34.12      2107

那么metadata可能包含

 metadata_id   title_id    key             value
  1            103         ISBN-13         978-1449373320
  2            103         ISBN-10         1449373320 
  3            104         budget          USD175000000
  4            104         EIDR            10.5240/EB14-C407-C74B-C870-B5B6-C
  5            104         Sound Designer  Barney Jones

然后,如果您想获得具有 ISBN-13 值的商品(我不熟悉 IBAN,但我想这是同一类事情),您可以这样做

  SELECT titles.*, isbn13.value isbn13
    FROM titles
    LEFT JOIN metadata isbn13 ON titles.title_id = metadata.title_id
                             AND metadata.key='ISBN-13'

这是一个很好的方法,因为它是面向未来的。如果明天有人出现并想要,比方说,书中或电影中最重要角色的名字,您可以轻松添加。