我是新来的。我有一个非常不寻常的要求,一个混合数据库,我需要建立。从我所看到的模块来看,以下内容似乎是可能的。
我需要能够将键-[值]添加到索引中,而无需向表中实际添加数据。简单地说,我需要一个键-[值]存储,理想情况下是一个btree(查找速度)。索引结构是理想的。也许另一个机构会这样做。
具体来说,我希望存储如下内容:
KEY [IDs]
Blue 10, 20, 23, 47
Green 5, 12, 40
我不想存储这些数据并对其进行索引。我只需要“索引但不存储”的数据。
同样重要的是,能够查询这些结构并获取数据(id),能够对id执行交集等操作,并在键上执行IN、BETWEEN、=,等操作。
正如您可能猜到的,最终目标是一个id的最终列表,然后将其发送到客户端,并随意查找。
编辑
我不想记录每个值的键。使用上面的例子,我不想存储{Blue,10},{Blue,20}等。我想存储{Blue,[10,20,23,47]}。
如果我把它作为一个传统的表存储,我就看不到解决这个重复问题的方法。
再看一下Blue,[10,20,23,47]},从技术上来说,这不过是一个btree,其中id(10,20,23,47)被标记为值,父键“Blue”被标记为键。
由于这种数据类型不匹配在一棵树中可能很混乱,我认为理想的解决方案是在一个btree中使用“[btree],其中“btree”是键,而[btrees]是键的每组值的btree。
最佳答案
如果您真的坚持这样做,您可以将值存储为一个数组,而intarray模块提供了操作这些值的运算符。即:
create table data(key text primary key, values int[] not null);
insert into data
values('Blue', '{10,20,23,47}'),('Green','{5,12,40}'),('Red', '{5,10,28}');
有了这个你可以写:
select unnest(values) from data where key = 'Blue'
intersect
select unnest(values) from data where key = 'Red';
理想情况下,您需要一个聚合函数来将int[]转换为一个集合并计算交集等,但似乎没有提供它们。
实际上,这只是对更典型结构的一个稍微紧凑的存储:
select key, unnest(values) as value from data;
key | value
-------+-------
Blue | 10
Blue | 20
Blue | 23
[...]
实际上,您可以简单地将视图定义为上述查询。
一种更为规范化的方法是有两个表:一个用于描述键,一个用于将键与值关联:
create table key_dimension(key_id serial primary key, key text not null unique);
insert into key_dimension(key) values('Blue'),('Green'),('Red');
create table key_value(key_id int not null references key_dimension(key_id), value int not null, primary key(key_id, value));
insert into key_value(key_id, value)
select key_id, unnest(values) from key_dimension join data using (key);
现在:
select value from key_value
where key_id = (select key_id from key_dimension where key = 'Red')
intersect
select value from key_value
where key_id = (select key_id from key_dimension where key = 'Blue')
因此,任何选择键值的查询都只需要针对键值集(key_维度)运行,然后使用最小合成键(key_id)将它们转换为实际的数据值集(从key_value)。