2011-07-27 39 views
21

在我看来,PostgreSQL数组数据类型的功能与标准的一对多和多对多关系有很大的重叠。什么是PostgreSQL阵列数据类型的正确用例?

例如,一个名为users的表可能有一个名为“favorite_colors”的数组字段,或者可能有一个名为“favorite_colors”的单独表和“users”和“favorite_colors”之间的联接表。

在什么情况下可以使用数组数据类型来代替全面连接?

回答

18

数组不应该类似于关系。它应该包含与一行非常紧密相关的索引值。例如,如果你有没有和足球比赛的结果的表,比你不需要做

id team1 team2 goals1 goals2 

,但会做

id team[2] goals[2] 

因为在这个例子中,大部分也会考虑正常化这分成两张桌子会很愚蠢。

因此,总而言之,如果您不关心如何建立关系,以及在哪里添加字段如field1 field2 field3,那么总之我会使用它。

+1

我想举两个upvotes对于这个答案,如果有可能;-) – Arsen7

+0

另一个例如,涉及基于机器的翻译。 (Sort of)http://stackoverflow.com/q/4967012/562459 –

+0

如果使用数组数据类型,那么如何轻松提取所有匹配中一个团队的性能数据? – hllau

1

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]); 
3

一个令人难以置信的方便使用情况标签:

CREATE TABLE posts (
    title TEXT, 
    tags TEXT[] 
); 

-- Select all posts with tag 'kitty' 
SELECT * FROM posts WHERE tags @> '{kitty}'; 
相关问题