数据库优化 - 编码字段

时间:2014-09-03 09:32:13

标签: database postgresql database-design relational-database

一些理论问题。

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

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

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

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

一些背景:

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

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

我并不真正关心实际表现。更多的是一个理论问题。

2 个答案:

答案 0 :(得分:1)

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

e.g。

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个字节。

答案 1 :(得分:0)

PostgreSQL的enums (enumerations)就是这样。

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

(是的,我在这里说明了我的例子。仍然强制进行二元性别选择的应用程序开发人员需要用线索点击,很难。与那些混淆"性别&#的人相同34;(生物)和"性别"(社会学)。)

枚举的主要限制是它们必须包含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扩展,必须始终使用引号将其与可能缩写为character的SQL标准char类型区分开来