Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Rails 4中查询PostgreSQL多维数组数据类型_Postgresql_Ruby On Rails 4_Rails Postgresql - Fatal编程技术网

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

在Rails 4中查询PostgreSQL多维数组数据类型,postgresql,ruby-on-rails-4,rails-postgresql,Postgresql,Ruby On Rails 4,Rails Postgresql,我正在使用PostgreSQL多维数组来模拟哈希数组,我正在寻找一种通过该数组中的键值对来定位记录的方法,例如[“key1”,“value1”]。一个示例阵列是: [[“键1”、“值1”]、[“键2”、“值2”]] 密钥使用我的case语言,一个密钥可能会出现多次 使用带有Rails 4的PostgreSQL索引,是否有一种通过键值对定位记录的有效方法 编辑:固定打字错误 我使用PostgreSQL多维数组来模拟哈希数组 这两件事其实并不完全相似,我不建议尝试使用多维数组对嵌套哈希进行建模 帕维

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

[[“键1”、“值1”]、[“键2”、“值2”]]

密钥使用我的case语言,一个密钥可能会出现多次

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

编辑:固定打字错误

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

这两件事其实并不完全相似,我不建议尝试使用多维数组对嵌套哈希进行建模

帕维尔说得很对,这可能更接近你想要的,而且它也是可转位的。但是,当前版本的hstore(第9.3页及更高版本)仅支持单级键;它是一个只能包含标量字符串值的字典/哈希。计划对hstore for PostgreSQL 9.4进行的增强有望带来多级嵌套和JSON语法兼容性

普通桌子 您可以使用edgelists和递归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[]));
测试:

因为每次解析hstore时都必须对其进行解析,这不会太快,而且在第二个级别上也不会获得通常的索引好处。尽管如此,如果您真的需要字段中的两级哈希,那么它仍然是一个选项

hstore值表 你可以很合理地把这两者结合起来

CREATE TABLE twolevel(key1 text, level2keyvalues hstore);
不过,对我来说,这看起来很难看;我宁愿以这样或那样的方式保持一致

SQL/XML 另一种选择是使用SQL/XML,您可以沿着任意XPATH表达式编制索引。同样,这似乎有点太复杂了

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

这两件事其实并不完全相似,我不建议尝试使用多维数组对嵌套哈希进行建模

帕维尔说得很对,这可能更接近你想要的,而且它也是可转位的。但是,当前版本的hstore(第9.3页及更高版本)仅支持单级键;它是一个只能包含标量字符串值的字典/哈希。计划对hstore for PostgreSQL 9.4进行的增强有望带来多级嵌套和JSON语法兼容性

普通桌子 您可以使用edgelists和递归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[]));
测试:

因为每次解析hstore时都必须对其进行解析,这不会太快,而且在第二个级别上也不会获得通常的索引好处。尽管如此,如果您真的需要字段中的两级哈希,那么它仍然是一个选项

hstore值表 你可以很合理地把这两者结合起来

CREATE TABLE twolevel(key1 text, level2keyvalues hstore);
不过,对我来说,这看起来很难看;我宁愿以这样或那样的方式保持一致

SQL/XML
另一种选择是使用SQL/XML,您可以沿着任意XPATH表达式编制索引。同样,这似乎有点太复杂了。

您可以使用扩展吗?然后看看Hstore扩展-这正是您想要的-我查看了Hstore,但正如Craig所说,它只支持单级键,并且由于键冲突,我需要返回一个数组作为值,例如{“key1”=>[“value1”,“value2”]}.寻找复杂的存储解决方案而不是数据库字段和表有什么特别的原因吗?丹尼斯:我有一个表必须是可审核的,而且每个语言环境也需要slug。我正在尝试创建一个不需要额外表来简化与审计需求交互的缓冲库,但这可能是一条死胡同。@AndreasSæbjørnsen单字段给了您什么审计术语中两级表所没有的?无论哪种方式,您都有一个事务,在审核表更改时使用触发器向该表添加一个更改或一组更改。您可以使用扩展吗?然后看看Hstore扩展-这正是您想要的-我查看了Hstore,但正如Craig所说,它只支持单级键,由于键冲突,我需要返回一个数组,以获得类似{“key1”=>[“value1”,“value2”]}的值。查找conva有什么特别的原因吗