在我看来,PostgreSQL数组数据类型的功能与标准的一对多和多对多关系有很大的重叠。什么是PostgreSQL阵列数据类型的正确用例?
例如,一个名为users的表可能有一个名为“favorite_colors”的数组字段,或者可能有一个名为“favorite_colors”的单独表和“users”和“favorite_colors”之间的联接表。
在什么情况下可以使用数组数据类型来代替全面连接?
在我看来,PostgreSQL数组数据类型的功能与标准的一对多和多对多关系有很大的重叠。什么是PostgreSQL阵列数据类型的正确用例?
例如,一个名为users的表可能有一个名为“favorite_colors”的数组字段,或者可能有一个名为“favorite_colors”的单独表和“users”和“favorite_colors”之间的联接表。
在什么情况下可以使用数组数据类型来代替全面连接?
数组不应该类似于关系。它应该包含与一行非常紧密相关的索引值。例如,如果你有没有和足球比赛的结果的表,比你不需要做
id team1 team2 goals1 goals2
,但会做
id team[2] goals[2]
因为在这个例子中,大部分也会考虑正常化这分成两张桌子会很愚蠢。
因此,总而言之,如果您不关心如何建立关系,以及在哪里添加字段如field1 field2 field3
,那么总之我会使用它。
The Postgresql documentation gives good examples:
CREATE TABLE sal_emp (
name text,
pay_by_quarter integer[],
schedule text[][]
);
上述命令将创建具有 类型的文本(名称)的列名为sal_emp表,类型整数 (pay_by_quarter)的一维阵列,其表示员工每季度的工资, 和一个二维文本(计划)数组,代表了员工的每周计划 。
或者,如果你喜欢:
CREATE TABLE tictactoe (
squares integer[3][3]);
一个令人难以置信的方便使用情况标签:
CREATE TABLE posts (
title TEXT,
tags TEXT[]
);
-- Select all posts with tag 'kitty'
SELECT * FROM posts WHERE tags @> '{kitty}';
我想举两个upvotes对于这个答案,如果有可能;-) – Arsen7
另一个例如,涉及基于机器的翻译。 (Sort of)http://stackoverflow.com/q/4967012/562459 –
如果使用数组数据类型,那么如何轻松提取所有匹配中一个团队的性能数据? – hllau