0

我们有一个包含太多行的数据库表。为了提高性能,我们正在尝试创建一个汇总表。这对一对一的关系很有用。例如,假设furniture有 atype和 a manufacturer_id,您可以有一个表同时包含这两个列和一个counts列。查询该表并很快获得给定类型的家具数量很容易。

但是,如果存在多对多关系怎么办?所以每件家具也可以有一个或多个colors和一个或多个distributors。那会发生什么?有什么方法可以总结这些数据,以便我可以快速找到有多少家具是绿色的?或者有多少是蓝色和黄色的?

显然这只是一个虚构的例子。但是给定一个包含数百万行的庞大数据库表,我如何创建一个汇总表来快速查找汇总信息?

4

4 回答 4

1

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

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

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

table color count
color_id
amount

这是一个非常简单的查询。您可以很好地对其进行索引,并且不需要连接。

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

于 2012-07-19T18:21:52.407 回答
0

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

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

我会做的是:

表 1:家具

  • 第 1 列:唯一 ID
  • 第 2 列:名称

表 2:经销商

  • 第 1 列:唯一 ID
  • 第 2 列:名称

表 3:颜色

  • 第 1 列:唯一 ID
  • 第 2 列:名称

表 4:家具经销商

  • 第 1 列:家具唯一 ID 值
  • 第 2 列:distributorUniqueID 值

表 5:家具颜色

  • 第 1 列:家具唯一 ID 值
  • 第 2 列:colorUniqueID 值

有多少家具是绿色的:

SELECT COUNT(*) FROM 家具颜色 WHERE colorUniqueIDvalue = 'green ID';

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

在 t1.furnitureUniqueIDvalue = t2.furnitureUniqueIDvalue AND t1.colorUniqueIDvalue = 'blue ID' AND t2.colorUniqueIDvalue = 'yellow ID' 上选择家具颜色作为 t1 INNER JOIN 家具颜色作为 t2;

使用正确的 SQL 语句(作为练习留给读者)可以获取蓝色和黄色家具的经销商列表,或者来自特定经销商的绿色或红色家具,或者大多数其他家具。

于 2012-07-19T18:21:43.307 回答
0

颜色汇总表中可能有2^n行,其中“n”是颜色数。如果您将颜色简化为位图并为每种颜色分配一个位置(红色=0、橙色=1、黄色=2、绿色=3 等),那么您的颜色汇总表可能是:

Color    Count
0x0001   256
0x0002   345
0x0003   23839
etc.

256只有红色,345只有橙色,23,839有红色和橙色。要计算有多少有红色但可能有其他颜色,需要对设置了位位置 0 的行求和。或者,可以设置一个单独的汇总表,其中只有“n”个条目,每种颜色一个,以避免对行求和。

如果您希望汇总表同时管理经销商和颜色,那么我认为它将有2^n * 2^m行(其中“m”是经销商的数量)来为多件家具拥有多个经销商的所有组合每个都可能有多种颜色。

于 2012-07-25T05:49:09.847 回答
0

您需要区分计算不同类型的家具(不同的家具 ID)和计算实际的家具件数。

如果您有一个经销商颜色表,那么您可以计算实际的家具件数。但是,您不能计算不同类型的家具。在 OLAP 的术语中,这是加法事实和非加法事实之间的区别。如果您对此主题感兴趣,请查看 Ralph Kimball 和他的经典著作“数据仓库工具包”。

要计算家具类型,您需要将其包含在表格中。因此,您需要一个分销商颜色家具表。现在要获得经销商的总数,您可以使用:

select distributor, count(distinct furnitureid)
from dcf
group by distributor

同样的颜色。

对于每个报告,您似乎希望将原始数据转换为事实表。这是开发数据集市的一个非常好的和标准的想法。您的数据集市可能有两个事实表。一种用于每种类型的家具(因此您可以轻松处理制造问题),另一种用于经销商颜色家具(用于更难的问题)。

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

于 2012-07-19T21:02:41.370 回答