【问题标题】:What is the best way to query data from multilpe tables and databases?从多个表和数据库中查询数据的最佳方法是什么?
【发布时间】:2010-10-19 14:57:15
【问题描述】:

我有 5 个代表该国不同地区的数据库。在每个数据库中,有几百个表,每个表有 10,000-2,000,000 条事务记录。每个表都代表相应地区的客户。这些表中的每一个都具有相同的架构。

我想查询所有表,就好像它们是一张表一样。我能想到的唯一方法是创建一个合并所有表的视图,然后针对它运行我的查询。但是,客户表会一直变化(随着我们获得和失去客户),所以我必须更改我的视图的查询以包含新表(或删除不再使用的表)。

有没有更好的办法?

编辑

作为对 cme​​ts 的回应,(我也将此作为对答案的回应):

在大多数情况下,我不会删除任何表格,它们将保留用于历史目的。正如我在对一个回复的评论中发布的那样,这个想法是为了减少小客户(一个只有 10,000 条记录)查询他们自己的历史记录的时间。大约有 1000 名客户,平均每件有 1,000,000 行(并且还在增长)。如果我将所有记录添加到一个表中,我将在该表中拥有近十亿条记录。我还以为我在为未来做计划,因为当我们有 5000 名客户时,我们没有一张巨大的桌子来保存所有交易记录(这可能是我的想法错误)。那么,像我这样划分记录是不是更好呢?我应该把它们全部捣碎成一张桌子吗?客户 ID 上的索引是否会防止为较小的客户查询数据时出现延迟?

【问题讨论】:

  • 听起来好像您正在根据获得的客户创建表,如果是这种情况,那么您的数据库设计不完善。
  • 我敢打赌你有各种疯狂的动态查询。我会推荐一个定义 ID、区域、名称等的客户表,然后是一个使用该客户 ID 和所有数据的事务表。然后,您可以使用 WHERE CustomerID=@x 和 ...编写查询。这是一个更好的设计

标签: sql sql-server sql-server-2000


【解决方案1】:

同意布兰,

这是一个疯狂的数据库架构设计。您为什么不使用(或者可以更改为)单个规范化结构,该结构具有按区域过滤的列以及将区域数据库中的每个表分开的任何条件。

在这种结构中,您会遇到一些非常大(约 500 个表)的联合视图,您必须在系统中出现新表时定期动态地重新生成。

【讨论】:

  • 肯定有这个选项。这仍处于规划阶段,客户还无法真正查询数据。
【解决方案2】:

听起来您被困在多租户和单租户数据库 shema 之间。具体来说,您将其存储为“轻量级”多租户(单独的表与单独的数据库),但将其作为单租户进行查询,一个查询来统治它们。

在短期内让您的数据访问层动态选择要查询的表,而不是将所有内容合并在一起以进行一次超级查询。

从长远来看,选择一种方法并坚持下去。一库一表或多库。

这里有一些关于这个主题的帖子。

What are the advantages of using a single database for EACH client?

http://msdn.microsoft.com/en-us/library/aa479086.aspx

【讨论】:

  • 感谢您的评论,我会检查一下。在这一点上,我想我要切换到一个表。查询数十亿条记录的想法让我无法接受。
  • 数十亿条记录也可能是个问题,你只需要选择毒药。祝你好运:)
【解决方案3】:

2 个解决方案 1. 编写一个存储过程,通过解析 5 个数据库中的所有表名来为您构建视图,并使用联合构建视图,就像您手动完成一样。

  1. 用一张表创建一个新数据库,并在每个示例中每晚导入该表中所有表的所有记录。

【讨论】:

    【解决方案4】:

    我认为您的设计可能会损坏。为什么不使用包含区域和客户列的单个表?

    如果我是你,我会考虑重构为一个表,并且如果有必要(例如为了反向兼容性),我会使用视图来提供与之前表中相同的信息。


    编辑以回答 OP cmets 对此帖子:

    只要您使用正确的索引,其中包含 10 000 000 000 行的表就可以了。数据库服务器就是为应对这种容量而构建的。

    性能绝对不是将一个这样的表拆分成数千个较小的表的正当理由!

    【讨论】:

    • 这个想法是,当客户查询他们自己的历史记录(比如只有 10,000 条记录)时,他们不会忍受查询 1,000,000,000 行的痛苦。如果我将所有记录添加到一个表中,它将接近 1,000,000,000 条记录,这似乎难以管理。
    • 不,不是。通过适当的索引,这应该可以正常工作。如果客户端需要直接访问数据库(当然不是其他客户端数据),您可以使用视图来处理。
    • 简单测试看看设计是否良好:添加/删除客户时是否更改数据或架构。如果您更改架构,那么它是坏的,如果您更改数据,那么它是好的。 +1
    • @mike,架构始终相同。目前,当添加新客户时,会添加一个新表(与其他表具有相同的架构)。新客户交易进入新表。其他表保持不变。
    • @scotty: 添加新表 = 修改 数据库 架构
    【解决方案5】:

    如果有几百个表并且每个表都有相同的架构

    ,这个系统的架构看起来需要一种截然不同的方法

    您为什么要添加或删除表格?在任何正常情况下都不应该发生这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多