如何分解表以获得最佳查询
Posted
技术标签:
【中文标题】如何分解表以获得最佳查询【英文标题】:How to decompose the tables for optimal querying 【发布时间】:2021-11-17 09:40:42 【问题描述】:假设我有三个表 Actor、Movie、Producer 具有以下属性
演员(Id,ActorName,Bio)
生产者(Id,ProducerName,Bio)
电影(ID、姓名、描述、演员姓名、制片人姓名)
一部电影可以有很多演员,演员可以演很多部电影,制片人也是如此。 如何有效地分解/创建新表来存储数据。我尝试使用以下架构创建一个新表
ActorMovie(Id, MovieId, ActorId)
但失败了,因为一部电影中可以有多个演员。
【问题讨论】:
您说您的ActorMovie
表失败,但您的意思是什么?这是正确的解决方案,如果您丢失了基于实现细节的表名称ActorMovie
而是将其命名为Cast
,这将变得更加明显,因为电影中的一组演员被称为演员! :) 此表上的id
列是多余的。主键只是MovieId
和ActorId
的组合,除非您希望能够支持一个演员扮演多个角色的电影,在这种情况下您需要添加一个@987654327 @ 列添加到表中,然后它将在键中包含角色。
@nihar 请检查我的答案,如果它不符合您的目的,请告诉我。最良好的祝愿。
抱歉命名约定,英语不是我的第一语言,但如果我创建该表,我们可以在一部电影中有多个演员,所以数据可能会变得多余,对吧?是否有可能消除这种冗余?假设我向 db 发送一个 post call 来添加电影,我需要如何让我的模型看起来像?
是的,MovieId
表中的MovieId
可以有多个具有相同值的行,但这没关系。如果我读到这里的字里行间,我想你已经相信如果表中的一列在不同的行上具有相同的值,那么这是一种正常的形式违规,我可以理解为什么人们会认为这。但这不对,您在此处使用的示例说明了为什么会这样。 Cast 表中的每一行都是电影和演员的唯一组合,即使表中可以有多行包含同一部电影。没关系。
【参考方案1】:
我想我有一个适合你的解决方案。我从您的描述中了解到,您的表格应如下所示。Actor(Id,ActorName,Bio); Producer(Id,ProducerName,Bio);Movie(Id,Name,Description);ActorMovie(Id, MovieId, ActorId);ProducerMovie(Id ,MovieId, ProducerId);
关系图应该是这样的。
注意:关系符号可能不正确,但连接应如上所示。
【讨论】:
在 ActorMovie 表中,我可以拥有多个演员的电影,那么如何处理呢? @nihar 你能用一些示例数据或一些图像解释一下吗? 是的@nihar。我可以在演员电影表中存储不同电影的不同演员。 假设有一部电影 Avenge,里面有演员 rob,mike,john 所以这张桌子一定是这样的 (1 34 2) (2 34 21) (3 34 98) 那我怎么能为rest api调用构建模型? @nihar 是的。但提到了冗余信息。您将哪一项称为冗余信息。以上是关于如何分解表以获得最佳查询的主要内容,如果未能解决你的问题,请参考以下文章
如果我有 X 的素数分解,如何有效地获得 X 的所有除数? [关闭]
算法:分解一个整数 X 以获得尽可能多的不同正整数 (Y1...Yk) 使得 (Y1+1)(Y2+1)...(Yk+1) = X