0

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

[ ["key1","value1"], ["key2","value2"] ]

就我而言,这些键是语言,一个键可能会出现不止一次。

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

编辑:修正错字

4

1 回答 1

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 可用之前,一种选择是存储嵌套 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 表达式对其进行索引。同样,这似乎有点太复杂了。

于 2013-06-25T08:45:20.060 回答