有效地存储和查询唯一整数和整数范围

问题描述

假设我们有一组从 0 到正 K(可以达到正无穷大)的整数,所有整数都涂成白色。我们决定随机绘制随机数量的这些整数红色。当绘制整数红色时,我们可以一个一个地绘制值,我们可以选择一系列值并一次绘制它们,或者两者的任意组合。所有剩余的未修改自动涂成蓝色。

最终目标是快速找出哪些整数被涂成蓝色。

所有整数都可以被其他人重新涂成红色。每次将一个整数涂成红色时,选择将其涂成红色的人的唯一姓名都会附加到该整数上,以便其他人知道还有谁将它涂成红色。

问题是,我应该用什么样的数据库结构来代替模型,以便我快速找出哪些值是蓝色的,而无需存储每个红色值?有没有其他办法?是否有我可以查看和学习的数据库结构和查询算法组合的示例?

解决方法

根据你的问题描述,你有两张表。一张红桌和一张蓝桌。

让我们从红色桌子开始。

Red
---
Red ID
Integer
User ID

红色 ID 是一个自动递增的整数主集群键值。它也被称为盲键。除了为该表提供主键外,没有其他意义。

所以,对于一个整数范围,表中会有多行。如果您愿意,您可以在 (Integer,User ID) 上创建唯一索引,以便您可以轻松找到谁将特定整数涂成红色,以及 (User ID,Integer) 以便您可以轻松找到特定用户涂成红色的整数。

蓝色表格行只是一个起始整数和一个结束整数。

Blue
----
Blue ID
Starting integer
Ending Integer

Blue ID 是一个自动递增的整数主集群键值。它也被称为盲键。除了为该表提供主键外,没有其他意义。

此表的行不会按整数升序存储。没关系。其他索引将保持整数的顺序。

您在起始整数上创建唯一索引,在结束整数上创建唯一索引。

要在蓝色表中查找特定整数,SELECT WHERE 子句将如下所示:

WHERE integer >= Starting integer AND integer <= Ending integer.

蓝色表格从一行开始。在本例中,让我们将 K 设为 100。

Blue ID | Starting Integer | Ending Integer
-------------------------------------------
      1                  0              100

好的。有人走过来,把 24 涂成红色。红色表随信息更新。蓝表修改成这样。

Blue ID | Starting Integer | Ending Integer
-------------------------------------------
      1                  0               23
      2                 25              100

所以发生的事情是数字 24 介于 0 和 100 之间。所以该行被更新为一个新的结束整数。然后添加了一个新行以覆盖剩余的数字。

到目前为止,蓝表是按数字顺序排列的。这不会持续。

有人走过来把 12 涂成红色。蓝表修改成这样。

Blue ID | Starting Integer | Ending Integer
-------------------------------------------
      1                  0               11
      2                 25              100
      3                 13               23

每次将数字涂成红色时,都会在蓝色表中创建一个新行。如果 0 和 K 之间的数字少于一半被涂成红色,这很有效。如果 0 和 K 之间的数字有一半以上被涂成红色。开始创建单个整数的 K 行并在将其涂成红色时删除每一行会更有意义。

你没有指定这个限制,所以我把这个决定留给你。

最后,如果蓝表是内存表,这个过程将快 1,000 倍(至少)。如果 K 太大以至于无法将表保存在内存中,那么这将是一个缓慢的过程。