【问题标题】:Database optimization - Encoding fields数据库优化 - 编码字段
【发布时间】:2014-10-27 18:01:56
【问题描述】:

有点理论题。

只是想知道有没有办法优化数据字段?

说对于给定的字段,您只有 3 个可能的字符串,但出于某种原因,这些字符串非常长(比如 50 个字符),声明该字段为 character_varying(50) 似乎浪费了很多磁盘空间,因为数据基本上适合2 位。

我想你可以通过加入标签表来解决这个问题,但是还有其他更合适的方法还是数据库能够自己自动优化这种列?

普通数据库是否能够自行处理这种优化? 有没有办法在数据库中声明这种结构(类似于 R 语言因子概念)? Postgresql 域结构是否有助于优化?

一些背景:

在您认为这是一个愚蠢的问题之前。我一直在使用旧的遗留系统(90 年代初),其中所有内容都经过大量编码以节省内存和性能(例如,性将被编码为 (1,2) 而不是(男性、女性)和许多不太明显的编码)。

现在我们正在将系统迁移到更现代的数据库 (postgresql),希望我们能够使用可读的“纯文本”字段。

我并不真正关心实际性能。更多的理论问题。

【问题讨论】:

  • 作为一个理论问题,这实际上是关于列约束的。普通的CHECK约束,或者用户定义的类型或者DOMAIN都可以使用。您还可以将域拆分为单独的表(甚至使用类似 EAV 的模型)

标签: database postgresql database-design relational-database


【解决方案1】:

PostgreSQL 的enums (enumerations) 就是为了这个。

CREATE TYPE sex AS ENUM ('male', 'female', 'intersex', 'unspecified');

(是的,我在这里用我的例子说明了一点。仍然强制二元性别选择的应用程序开发人员需要用线索棒打击,很难。与那些混淆“性别”(生物)和“性别”(社会学)。)

枚举的主要限制是它们必须包含name,而不是任意长度的字符串,并且您不能删除值,只能附加/插入它们。在所有标准 PostgreSQL 构建中,NAMEDATALEN 设置为 63 字节。所以你不能使用 long 字符串:

regress=> CREATE TYPE long AS ENUM ('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
ERROR:  invalid enum label "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
DETAIL:  Labels must be 63 characters or less.

枚举在内部被编码为int4 值:

regress=> SELECT pg_column_size( 'female'::sex );
 pg_column_size 
----------------
              4
(1 row)

所以实际上更紧凑来存储"char"

select pg_column_size('m'::"char");

如果您不介意失去自记录的可读性以及无法独立于值指定排序顺序。 "char" 是 1 字节固定大小字符值的 PostgreSQL 扩展,必须始终使用引号将其与 SQL 标准 character 类型(可能缩写为 char)区分开来。

【讨论】:

  • 非常感谢,正是我需要的。
【解决方案2】:

我认为您正在寻找必须专门创建的“枚举”数据类型,它将数据保存为整数,但在 SELECT 上将其转换为字符串

例如

CREATE TYPE my_specific_text_field AS ENUM
(
'string one with longish text',
'second string with fairly long text',
'third string'
);

CREATE TABLE test (
id serial not null primary key,
myenum my_specific_text_field
);

INSERT INTO test (myenum) VALUES ('string one with longish text');

也就是说,如果您不熟悉枚举,枚举可能会有点麻烦,导出枚举可能会很棘手,而且我相信它们的长度上限为 63 个字节。

【讨论】:

  • 谢谢大家,看来正是我想要的。
猜你喜欢
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 2013-08-09
  • 2013-12-14
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
相关资源
最近更新 更多