一些理论问题。
只是想知道有没有办法优化数据字段?
对于给定字段,您只有3个可能的字符串,但由于某种原因这些字符串非常长(比如50个字符),声明字段变量(50)似乎浪费了大量磁盘空间,因为数据基本上适合2位。
我想你可以通过加入标签表来解决这个问题,但还有另一种更合适的方法,或者数据库是否能够自行优化这种列?
普通数据库是否能够处理自己的那种优化? 有没有办法在DB中声明这种结构(类似于R语言因素概念)? Postgresql域结构是否有助于优化?
一些背景:
在你认为这是一个愚蠢的问题之前。我一直在使用旧的遗留系统(90年代早期),其中所有内容都经过大量编码以节省内存和性能(例如性别将被编码(1,2)而不是(男性,女性)和许多不太明显的编码)。
现在我们将系统转移到更现代的数据库(postgresql),希望我们能够使用可读的纯文本"字段。
我并不真正关心实际表现。更多的是一个理论问题。
答案 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
类型区分开来