在Rails 4中查询PostgreSQL多维数组数据类型

时间:2013-06-25 07:08:44

标签: postgresql ruby-on-rails-4 rails-postgresql

我正在使用PostgreSQL多维数组来模拟哈希数组,我正在寻找一种通过该数组中的键值对来定位记录的方法,例如[“key1”,“value1”] 。示例数组是:

[[“key1”,“value1”],[“key2”,“value2”]]

密钥是我的案例语言,密钥可能不止一次出现。

使用带有Rails 4的PostgreSQL索引是否有一种通过键值对定位记录的有效方法?

编辑:修正错误

1 个答案:

答案 0 :(得分:3)

  

我正在使用PostgreSQL多维数组来模拟哈希数组

这两件事并不是那么相似,我不建议尝试使用多维数组来模拟嵌套的哈希值。

Pavel非常正确hstore可能更接近你想要的东西,并且它也是可索引的。但是,当前版本的hstore(在Pg 9.3及更早版本中)仅支持单级密钥;它是一个只能包含标量字符串值的字典/哈希。计划对PostgreSQL 9.4的hstore进行增强,有望带来多级嵌套和JSON语法兼容性。

普通表

您可以使用边缘列表和递归CTE对任意深度的键/值链(和树/图)进行建模,但这可能比您真正想要的更复杂。

如果您只需要固定的两级键/值列表,只需使用列出两个关键级别的表:

CREATE TABLE twolevel(key1 text, key2 text, thevalue text not null, PRIMARY KEY(key1,key2));

这可以让你限制重复的密钥对,这很不错。

您还可以使用两个表之间具有外键关系的表。如果需要,这将为您提供级联删除,因此删除顶级键将删除所有子级别键和关联值。但是,使用单表方法很容易做到这一点。

使用这两种方法中的一种,除非你有充分的理由不这样做。

Hstore as text

在扩展的hstore可用之前,一个选项是存储嵌套的hstore字段的文本表示。这不是很好或有效,但它可能比尝试搜索多维数组更好。

CREATE TABLE nested_hstore(id integer, blah hstore);

insert into nested_hstore(id, blah) values 
(1, hstore( ARRAY['key1','key2'], ARRAY['"key1.1"=>"value1.1", "key1.2"=>"value1.2"', '"key2.1"=>"value2.1", "key2.2"=>"value2.2"']::hstore[]::text[]));

测试:

regress=> select (blah->'key1')::hstore->'key1.1' from nested_hstore ;
 ?column? 
----------
 value1.1
(1 row)

因为每次不能超快速地解析hstore,并且你不会在第二级获得通常的索引优势。不过,如果你真的需要两个级别的哈希,那么这是一个选择。

hstore值表

你可以合理地将这两者结合起来。

CREATE TABLE twolevel(key1 text, level2keyvalues hstore);
但是,对我来说,这似乎很难看。我宁愿以某种方式保持一致。

SQL / XML

另一种选择是使用SQL / XML,您可以使用任意XPATH表达式进行索引。再次,这似乎有点过于复杂。