我正在使用PostgreSQL多维数组来模拟哈希数组,我正在寻找一种通过该数组中的键值对来定位记录的方法,例如[“key1”,“value1”] 。示例数组是:
[[“key1”,“value1”],[“key2”,“value2”]]
密钥是我的案例语言,密钥可能不止一次出现。
使用带有Rails 4的PostgreSQL索引是否有一种通过键值对定位记录的有效方法?
编辑:修正错误
答案 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可用之前,一个选项是存储嵌套的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,并且你不会在第二级获得通常的索引优势。不过,如果你真的需要两个级别的哈希,那么这是一个选择。
你可以合理地将这两者结合起来。
CREATE TABLE twolevel(key1 text, level2keyvalues hstore);
但是,对我来说,这似乎很难看。我宁愿以某种方式保持一致。
另一种选择是使用SQL / XML,您可以使用任意XPATH表达式进行索引。再次,这似乎有点过于复杂。