首页 > 解决方案 > 在 SQL 数据库中存储非关系整数列表

问题描述

首先,需要注意的是,我读过几篇文章,都说在 SQL 中将值列表存储在单个列中是一个坏主意,并且违反了所有设计协议。事实上,他们都说要重新设计表格,以便它是关系型的。因此,我在这里寻找的不是简单的解决方案,而是正确的解决方案。

这是问题所在,我有两个变量:

1) 与userId其他表相关的唯一性和

2) 与 JSON 文件中的项目相关的简单整数哈希集。

因此,这些数字与我的 SQL 数据库中的任何其他表无关。此列表中的最大值可能不会超过 1000,但谁知道呢。该列表也可能乱序或跳过中间的多个值。我永远不会查询这些数字,但我会在用户登录时加载它们,并在用户注销时重新保存它们。

我读过的选项是逗号分隔值列、xml 或查找表(在这种情况下,我不知道我在查找什么,并且有 1000 个数字,可能有 1E-249 排列) .

因此,我问保存这个整数列表的正确方法是什么。

标签: sql

解决方案


鉴于您不需要保留顺序并且不需要保留重复项,如果您希望数据库处于第一范式,您可以轻松地将其存储在任何数据库的两列表中:

create table MyTable (
  UserId int not null,
  Value int not null,
  primary key (UserId, Value) );

如果 ID 为 1 的用户持有值 [1, 2, 8, 33, 999],而 ID 为 2 的用户持有值 [3, 4],则将其存储为 7 条记录:

用户名 | 价值
     1 | 1
     1 | 2
     1 | 8
     1 | 33
     1 | 999
     2 | 3
     2 | 4

这类似于您的查找表的想法,除了您不必查找值的含义,您可以将值直接存储在该表中。

这样做的好处是任何一组数字都只有一个规范表示,并且数据库不能保存一组数字以外的任何东西。您不必在代码中担心某些记录可能会包含您在应用程序中必须忽略的重复值 ( [1, 1])、具有相同值的两个用户以不同方式表示 ( [1, 2]vs. [2, 1]) 或具有完全无效值的用户 ([1, "abc"]1.23)。

另一个好处是这可以使用 100% 标准 SQL 轻松处理。您不需要任何非标准扩展,因此您可以保持代码跨数据库实现的可移植性。

实际问题可能建议采用其他方法。您对 CSV 或 XML 的建议是有效的。另一种可能性是 JSON。这三个都在至少一个主要的数据库实现中具有原生支持,尽管在大多数情况下,表方法应该足够好,但取决于数据集的大小和访问模式,非规范化数据库可能会带来更好的性能. 读取和更新值的代码也可能更容易编写。

这是您需要自己做出的权衡。我希望你现在有足够的信息来完成它。


推荐阅读