将相似的数据拆分到两个表中?
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 Books
和 Movies
.
中
但如果将来发生任何意外,您将需要重建结构或改变您的假设。但无论如何,使用实体 Production
会更容易。然后您只需创建具有修改值的新行并分配给选定的 Book
或 Movie
.
书籍和电影的 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 以获得出色的编目示例。就两个:
- https://www.worldcat.org/title/coco/oclc/1149151811
- https://www.worldcat.org/title/designing-data-intensive-applications-the-big-ideas-behind-reliable-scalable-and-maintainable-systems/oclc/1042165662
我的建议:添加一个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'
这是一个很好的方法,因为它是面向未来的。如果明天有人出现并想要,比方说,书中或电影中最重要角色的名字,您可以轻松添加。
我有两组几乎相同的数据,一组是书籍,另一组是电影。
所以我们有这样的东西:
- 标题
- 价格
- 图片
- 发布日期
- 已发布
等等
两组数据的唯一区别是 Books 有一个 ISBN 字段,而 Movies 有一个 Budget 字段。
我的问题是,即使数据相似,也应该合并为一个 table 还是应该分开两个 table?
我在 SO 上看过类似的问题,但之所以问,是因为大多数时候我的应用程序需要获取书籍和电影的单一列表。很难得到书或电影。因此,如果数据被拆分为两个 table,我需要为大多数查询查找两个 table。
您必须非常确定您的申请 requests/features 的未来。
我无法想象您存储的与电影相关联的书籍类型,因此很多电影的标题与所依据的书籍不同。示例:25 films that changed the name.
如果您确定您的数据将持久存在并且对于书籍和电影始终相同,那么您可以创建新的 table 例如 Productions
并在其中存储标题、价格、图像、发布日期,发布。然后你可以将 Production
实体的外键存储在你的 tables Books
和 Movies
.
但如果将来发生任何意外,您将需要重建结构或改变您的假设。但无论如何,使用实体 Production
会更容易。然后您只需创建具有修改值的新行并分配给选定的 Book
或 Movie
.
书籍和电影的 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 以获得出色的编目示例。就两个:
- https://www.worldcat.org/title/coco/oclc/1149151811
- https://www.worldcat.org/title/designing-data-intensive-applications-the-big-ideas-behind-reliable-scalable-and-maintainable-systems/oclc/1042165662
我的建议:添加一个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'
这是一个很好的方法,因为它是面向未来的。如果明天有人出现并想要,比方说,书中或电影中最重要角色的名字,您可以轻松添加。