我有5个数据库,代表该国的不同地区。在每个数据库中,有几百个表,每个表有10,000-2,000,000个事务记录。每个表都是相应区域中客户的表示。这些表中的每一个都具有相同的模式。
我想查询所有表,就好像它们是一个表一样。我能想到的唯一方法是创建一个联合所有表的视图,然后只针对它运行我的查询。但是,客户表将一直在变化(因为我们获得和失去客户),因此我必须更改我的视图的查询以包括新表(或删除不再使用的表)。
有更好的方法吗?
回应评论时,(我也将此作为对答案的回复):
在大多数情况下,我不会删除任何表格,它们将保留用于历史目的。正如我在一篇回复中发表评论时,其想法是减少较小客户(一个只有10,000条记录)的时间来查询自己的历史记录。大约有1000个客户平均有1,000,000行(并且正在增长)。如果我要将所有记录添加到一个表中,那么该表中将有近十亿条记录。我还以为我正在计划未来,因为当我们说5000个客户时,我们没有一个包含所有交易记录的巨型表(这可能是我的想法中的错误)。那么,最好不要像我一样划分记录吗?我应该将它们全部混合到一张桌子里吗?对客户ID进行索引是否可以防止向小客户查询数据的延迟?
答案 0 :(得分:7)
我认为您的设计可能会被打破。为什么不将一个表与区域和客户列一起使用?
如果我是你,我会考虑重构一个表,如果有必要(例如反向兼容),我会使用视图提供与前面表格相同的信息。
编辑以回复此帖子的OP评论:
如果你使用正确的索引,一个包含10 000 000 000行的表就可以了。构建数据库服务器是为了应对这种卷。
性能绝对不是将一个这样的表分成数千个小表的正当理由!
答案 1 :(得分:2)
同意Brann,
这是一个疯狂的DB Schema Design。为什么不选择(或者可以选择更改)单个规范化结构,其中列按区域过滤,并且区域数据库中的每个表分隔的条件。
在这种结构中,你会遇到一些非常大的(~500个表)联合视图,你必须像系统中出现新表一样定期动态重新生成。
答案 2 :(得分:2)
如果几百个表并且每个具有相同的架构
,该系统的体系结构闻起来需要一种截然不同的方法。为什么要添加或删除表?这不应该在任何正常情况下发生。
答案 3 :(得分:0)
2种解决方案 1.通过解析5个数据库中的所有表名来编写一个为您构建视图的存储过程,并像手工一样构建带有union的视图。
答案 4 :(得分:0)
听起来像是卡在多租户和单租户数据库之间的某个地方。具体来说,您将其存储为“轻型”多租户(单独的表与单独的数据库),但查询为单租户,一个查询来统治它们。
在短期内,您的数据访问层会动态选择要查询的表,而不是将所有内容组合在一起进行一次超级查询。
从长远来看,选择一种方法并坚持下去。一个数据库和一个表或许多数据库。
以下是有关该主题的一些帖子。
What are the advantages of using a single database for EACH client?