如何分解表以获得最佳查询

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 列是多余的。主键只是MovieIdActorId 的组合,除非您希望能够支持一个演员扮演多个角色的电影,在这种情况下您需要添加一个@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

奇异值分解

如何在 Bigquery 中查询每小时分解的 Firebase 事件报告?