2

我们经常将 VARCHAR 用于本质上是枚举值。我知道将它们提取到单独的查找表中并使用整数 ID 作为外键通常很聪明,但有时没有其他表正在使用它,而且我们不想要另一个 JOIN,所以我们选择将它们保留在主表。

所以,问题是,是否有一些数据库功能可以让我标记这些列,然后使用一些内部查找表来节省空间并提高我的查询性能?类似于 Postgres 的ENUMs的东西,但这不需要预先明确声明可能的值。

例如,我想做一个 INSERT:

INSERT INTO table (date, status) VALUES ('2011-01-25', 'pending');

并且'pending'将在内部被视为整数,仅保留实际字符串的一个实例,即使多行包含相同的 value 'pending'

在某些编程语言(LISP、Ruby)中,类似的特性称为符号,实际上是“命名整数”。

我主要对 Postgres 和 MySQL 感兴趣,但任何其他指针也将不胜感激。

4

2 回答 2

1

除了其他技巧之外,Oracle 表压缩和 SQL Server 页面压缩都可以做到这一点。使用内置压缩例程的好处是它们是完全透明的——在您的代码中不需要额外的连接,并且由于磁盘访问较少,访问压缩通常比未压缩更快。我认为 Postgres 在使用 EXTERNAL 存储策略时将其作为TOAST的一部分,但仅限于更大的字段。

于 2011-01-26T16:27:01.420 回答
0

我知道这不能回答你的问题,但我已经用函数和查找表来完成它,或者在速度很重要的地方,只返回一个常量的函数。

IE:

INSERT INTO
  table (date, status)
VALUES
  ('2011-01-25', udf_getConst('statuscode','pending'));

或者

INSERT INTO
  table (date, status)
VALUES
  ('2011-01-25', udf_Const_StatusCode_Pending());

如果您在查询中的多个位置使用常量,请考虑先将其选择到变量中。

You can also use bitwise logic for different status codes and store multiple values in a single integer column.

于 2011-01-26T22:46:09.873 回答