SQL中的隐式枚举类型(即符号)

时间:2011-01-26 14:33:20

标签: sql symbols varchar lookup-tables

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

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

例如,我想做一个INSERT:

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

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

在某些编程语言(LISP,Ruby)中,类似的功能称为symbols,事实上是“命名整数”。

我主要对Postgres和MySQL感兴趣,但任何其他指针也会受到赞赏。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我知道这不能回答你的问题,但我已经完成了功能和查找表,或速度很重要的功能,只返回常量。

即:

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());

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

您还可以对不同的状态代码使用按位逻辑,并将多个值存储在单个整数列中。