Mysql 有没有办法为多对多关系创建汇总表?
我们有一个数据库表,它有太多的行。为了提高性能,我们尝试创建一个汇总表。这对一对一的关系非常有效。e、 g.假设Mysql 有没有办法为多对多关系创建汇总表?,mysql,database,many-to-many,query-optimization,Mysql,Database,Many To Many,Query Optimization,我们有一个数据库表,它有太多的行。为了提高性能,我们尝试创建一个汇总表。这对一对一的关系非常有效。e、 g.假设家具有一个类型和一个制造商id,您可以有一个同时包含这两列和一个计数列的表。查询该表并快速获得给定类型家具的数量是很容易的 但是,如果存在多对多关系呢?因此,每件家具也可以有一种或多种颜色和一种或多种分销商。然后呢?有没有办法总结一下这些数据,以便我能快速找到多少家具是绿色的?或者有多少是蓝色和黄色的 显然,这只是一个虚构的例子。但是,如果有一个包含数百万行的大型数据库表,我如何创建一
家具
有一个类型
和一个制造商id
,您可以有一个同时包含这两列和一个计数
列的表。查询该表并快速获得给定类型家具的数量是很容易的
但是,如果存在多对多关系呢?因此,每件家具也可以有一种或多种颜色
和一种或多种分销商
。然后呢?有没有办法总结一下这些数据,以便我能快速找到多少家具是绿色的?或者有多少是蓝色和黄色的
显然,这只是一个虚构的例子。但是,如果有一个包含数百万行的大型数据库表,我如何创建一个摘要表来快速查找聚合信息呢?多个表应该可以减小大小。。。一个好的数据库系统应该保持性能 在我看来,保留一个单独的“汇总表”会产生很多开销和维护问题,只有在反复需要相同的汇总信息时才真正有用(即,有多少家具是绿色的,而没有存储多少家具是蓝色的,有多少家具是黄色的,有多少家具是蓝色和黄色的,等等) 我要做的是: 表1:家具
- 第1列:uniqueID
- 第2列:名称
- 第1列:uniqueID
- 第2列:名称
- 第1列:uniqueID
- 第2列:名称
- 第1列:家具唯一值
- 第2列:distributorUniqueIDvalue
- 第1列:家具唯一值
- 第2列:ColorUniquedValue
使用右边的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