对于变长的数据库 Table 有什么好的解决方案?

What Are Good Solutions for a Database Table that Gets to Long?

我将使用特定场景描述问题:

假设您创建了一个用户可以注册的网站,
注册后,他们可以互相发送私信。

本网站使每个用户都可以维护自己的好友列表,
并维护一个已阻止的用户列表,他不想从中获取消息。

现在的问题:

想象一下这个网站有数百万用户,
我们还假设每个用户在好友 table 中有大约 10 个好友,在被阻止的用户中有 10 个被阻止的用户 table.

好友列表Table和被屏蔽的用户table会变得很长,
但更糟糕的是,每当有人想向另一个人“X”发送消息时,
我们需要遍历整个被阻止的用户 table,并查找用户“X”定义的记录 - 他阻止的人。

每次从一个用户向另一个用户发送消息时,这种对长数据库的“扫描”table,对我来说似乎效率很低。

所以我有两个问题:

  1. 这个问题有哪些可能的解决方案?
    我不怕长数据库tables,
    但我担心数据库 table 包含这么多用户的数据,
    这意味着每次 都需要扫描整个 table ,只是为了从中为特定用户提取一些记录。

  2. 我想到的具体解决方案,想请教一下:
    对于这个问题,我想到的一个解决方案是,每个注册到该网站的用户都会有自己的动态(和编程)为他创建的“迷你数据库”,
    这样,朋友 table 和被阻止的用户 table 将包含 仅他的记录
    这使得扫描那些 table 非常容易,因为所有记录都是给他的。
    这个想法是否存在于 MS-SQL Server 或 MySQL 等数据库中?如果是,它是否是描述问题的良好解决方案?
    (每个用户都会为他创建自己的小型数据库,当然还有用于非用户特定的所有其他数据的主(公共)数据库)

谢谢大家

我的第一个想法是:

https://msdn.microsoft.com/en-us/library/ms188730.aspx

分区可以让您以可扩展的方式将其分解成更易于管理的部分。关于如何拆分它,您必须做出一些选择,但我相信这是适合您的正确方法。

关于 table 扫描,如果您有适当的索引,您应该在查询中进行搜索。不过,您需要查看执行计划才能确定这一点。

至于为每个用户提供迷你数据库,这是您可以通过分区实现的。

  1. Mini-Database 对每个用户来说都是一个明确的禁区。
  2. 加上旁注单独的 table 仅包含两列 UserIDBlockedUserID 都是 INT 列并且具有正确的索引,您不会出错使用这种方法,如果您明智地编写查询:)
  3. 研究 table 分区,一个规范化良好且索引良好的数据库也会有所帮助。
  4. 此外,如果您能负担得起企业许可 table,使用上一点中描述的 table 模式进行分区将使它成为一个非常好的、查询友好的数据库模式。

我会等待分区和创建迷你数据库的想法。您的数据库是否在不同的 RAID 驱动器上安装了数据、日志和临时文件? table 上是否有聚簇索引以及搜索和连接列上是否有索引?

您是否尝试过任何类型的阅读查询计划来查看速度减慢的发生方式和位置?不要在做基础之前只加内存或盲目尝试高级功能。

创建单独的数据库将成为维护的噩梦,并且执行您将来可能喜欢执行的查询类型(针对所有用户......)将具有挑战性。

分区是 SQL 服务器的一个很棒的功能,虽然在 2014 年您可能有数千个分区(除非您将每个分区放在单独的驱动器上),但您可能不会看到性能的大幅提升正在寻找。

SQL 服务器的响应时间非常快 tables(尤其是 tables 的数百万行(在您的情况下是用户 table) ).不要让 main table 变得太宽,响应时间会非常快。

我曾经为一个社交网络系统做过一次。也许你可以寻找你的归一化。当时我得到了一个[Relationship] table,它刚好得到

UserAId  Int
UserBId  Int
RelationshipFlag  Smallint

有 100 万用户,每个用户有 10 "friends",table 有 1000 万行。没问题,因为我们在列上放置了索引,它可以立即将所有 "related" userB 的列表检索到特定的 userA。

仔细查看您的架构和索引,如果它们没问题,您的数据库将不会在处理它时遇到问题。

编辑

我同意@M.Ali

Mini-Database for each user is a definite no-go zone.

恕我直言,如果你坚持基本原则并以正确的方式实施它就没问题