Mysql 有没有办法为多对多关系创建汇总表?

Mysql 有没有办法为多对多关系创建汇总表?,mysql,database,many-to-many,query-optimization,Mysql,Database,Many To Many,Query Optimization,我们有一个数据库表,它有太多的行。为了提高性能,我们尝试创建一个汇总表。这对一对一的关系非常有效。e、 g.假设家具有一个类型和一个制造商id,您可以有一个同时包含这两列和一个计数列的表。查询该表并快速获得给定类型家具的数量是很容易的 但是,如果存在多对多关系呢?因此,每件家具也可以有一种或多种颜色和一种或多种分销商。然后呢?有没有办法总结一下这些数据,以便我能快速找到多少家具是绿色的?或者有多少是蓝色和黄色的 显然,这只是一个虚构的例子。但是,如果有一个包含数百万行的大型数据库表,我如何创建一

我们有一个数据库表,它有太多的行。为了提高性能,我们尝试创建一个汇总表。这对一对一的关系非常有效。e、 g.假设
家具
有一个
类型
和一个
制造商id
,您可以有一个同时包含这两列和一个
计数
列的表。查询该表并快速获得给定类型家具的数量是很容易的

但是,如果存在多对多关系呢?因此,每件家具也可以有一种或多种
颜色
和一种或多种
分销商
。然后呢?有没有办法总结一下这些数据,以便我能快速找到多少家具是绿色的?或者有多少是蓝色和黄色的


显然,这只是一个虚构的例子。但是,如果有一个包含数百万行的大型数据库表,我如何创建一个摘要表来快速查找聚合信息呢?

多个表应该可以减小大小。。。一个好的数据库系统应该保持性能

在我看来,保留一个单独的“汇总表”会产生很多开销和维护问题,只有在反复需要相同的汇总信息时才真正有用(即,有多少家具是绿色的,而没有存储多少家具是蓝色的,有多少家具是黄色的,有多少家具是蓝色和黄色的,等等)

我要做的是:

表1:家具

  • 第1列:uniqueID
  • 第2列:名称
表2:分销商

  • 第1列:uniqueID
  • 第2列:名称
表3:颜色

  • 第1列:uniqueID
  • 第2列:名称
表4:家具经销商

  • 第1列:家具唯一值
  • 第2列:distributorUniqueIDvalue
表5:家具颜色

  • 第1列:家具唯一值
  • 第2列:ColorUniquedValue
有多少家具是绿色的:

从家具颜色中选择COUNT(*),其中colorUniqueIDvalue='green ID'

有多少家具是蓝色和黄色的:

从家具颜色中选择COUNT(*)作为t1内部连接家具颜色作为t1上的t2。furnitureUniqueIDvalue=t2.furnitureUniqueIDvalue和t1.colorUniqueIDvalue=‘蓝色ID’和t2.colorUniqueIDvalue=‘黄色ID’


使用右边的SQL语句可以获取蓝色和黄色家具的经销商列表,或者从绿色或红色的特定经销商处获取家具列表,或者获取其他任何东西(左边是读者的练习).

假设您知道自己在做什么,并且知道这是一个真正的瓶颈:您现在有性能度量吗?你知道从哪里开始需要时间吗

无论如何,您都必须查询数据库才能获得该计数。因此,您可以将其存储在单独的表中,如颜色计数和分发计数。另一种解决方案是在缓存系统中缓存这些查询的结果。例如,如果您已经使用memcached或其他一些工具

当您只有一个数据库时,最简单的方法就是创建一个表:

table color count
color_id
amount
这是一个非常简单的查询。您可以很好地索引它,并且不需要连接


可以使用触发器、cron或在更新多对多表时进行更新。取决于您的需求和容量。考虑到更新记录也需要时间,所以用它来优化读取,这就是我在你的问题中读到的。

你需要区分计算不同类型的家具(不同的家具id)和计算实际家具

如果您有一个分销商颜色表,那么您可以计算家具的实际件数。但是,不能计算不同类型的家具。在OLAP术语中,这是可加性事实和非可加性事实之间的区别。如果您对这个主题感兴趣,请查看拉尔夫·金博尔(Ralph Kimball)及其经典著作《数据仓库工具包》

要计算家具类型,您需要将其包括在表中。所以,你需要一张彩色家具桌。现在,要获取分销商的总额,您可以使用:

select distributor, count(distinct furnitureid)
from dcf
group by distributor
颜色也一样

对于每个报告,您似乎都希望将原始数据转换为事实表。这是开发数据集市的一个非常好的标准想法。您的数据集市可以有两个事实表。每种类型的家具各有一个(这样您就可以轻松地处理制造问题),而分销商颜色的家具则有一个(针对较难的问题)


有些数据库(如Oracle和SQL Server)支持这些类型的数据结构。你所说的更像是一个新的“系统”,而不仅仅是一张新的“桌子”。您需要考虑事实表的维度、更新以及所需的报告类型。

在颜色摘要表中可能会有2^n行,其中“n”是颜色数。如果将颜色减少为位图,并为每种颜色指定一个位置(红色=0、橙色=1、黄色=2、绿色=3等),则颜色汇总表可以是:

Color    Count
0x0001   256
0x0002   345
0x0003   23839
etc.
256个只有红色,345个只有橙色,23839个有红色和橙色。要获得有多少行具有红色但可能具有其他颜色的计数,需要对设置了位位置0的行求和。或者,可以设置一个单独的汇总表,其中只包含“n”个条目,每种颜色一个条目,以避免对行求和


如果您希望汇总表同时管理分发服务器和颜色,那么我认为它应该有2^n*2^m行(其中'm'是分发服务器的数量)为多件家具提供多个分销商的所有组合,每个分销商可能有多种颜色。

那么,如果我的理论家具业务有2亿件家具,会发生什么?然后是家具经销商和家具-c