PostgreSQL数组数据类型的正确用例是什么?

PostgreSQL数组数据类型的正确用例是什么?,postgresql,Postgresql,在我看来,PostgreSQL数组数据类型的功能与标准的一对多和多对多关系重叠很多 例如,一个名为users的表可以有一个名为“favorite_colors”的数组字段,也可以有一个名为“favorite_colors”的单独表以及“users”和“favorite_colors”之间的联接表 在什么情况下可以使用数组数据类型而不是完整连接?数组不应与关系类似使用。它应该包含与一行紧密相关的索引值。例如,如果你有一张有足球比赛结果的桌子,你就不需要这样做了 id team1 team2 goa

在我看来,PostgreSQL数组数据类型的功能与标准的一对多和多对多关系重叠很多

例如,一个名为users的表可以有一个名为“favorite_colors”的数组字段,也可以有一个名为“favorite_colors”的单独表以及“users”和“favorite_colors”之间的联接表


在什么情况下可以使用数组数据类型而不是完整连接?

数组不应与关系类似使用。它应该包含与一行紧密相关的索引值。例如,如果你有一张有足球比赛结果的桌子,你就不需要这样做了

id team1 team2 goals1 goals2
但这样就行了

id team[2] goals[2]

因为在这个例子中,大多数人也会考虑把这个规范化成两个表是愚蠢的。 总之,我会在你不想建立关系的情况下使用它,在其他情况下,你会添加像

field1 field2 field3这样的字段

上面的命令将创建一个名为sal_emp的表,其列为 键入text(name),一个整数类型的一维数组 (按季度支付),表示员工按季度的工资, 以及一个二维文本数组(schedule),它表示 员工的每周时间表

或者,如果您愿意:

 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}';

我完全同意@marc。当您完全确定不需要在数组中的项与任何其他表之间创建任何关系时,将使用数组。它应该用于紧密耦合的一对多关系。
一个典型的例子是创建多选择问题系统。由于其他问题不需要知道问题的选项,因此选项可以存储在数组中。
例如

CREATE TABLE Question (
  id integer PRIMARY KEY,
  question TEXT,
  options VARCHAR(255)[],
  answer VARCHAR(255)
)  

这比创建一个
question\u options
表并通过连接获取选项要好得多。

如果我想存储一些类似类型的数据集,而这些数据没有任何其他属性

我更喜欢使用数组

一个例子是:

存储用户的联系人号码

所以,在这种情况下,当我们想要存储联系人号码时,通常是主联系人号码和备用联系人号码

我更喜欢使用数组

CREATE TABLE students (  
    name text,
    contacts varchar ARRAY -- or varchar[]
);
但如果这些数据具有附加属性,比如存储卡。 信用卡可以有到期日期和其他详细信息

另外,将标签存储为数组也是一个坏主意。一个标签可以关联到多个帖子


在这种情况下不要使用数组。

如果可能的话,我会投两张赞成票;-)另一个例子,与基于机器的翻译有关。(有点。)如果使用数组数据类型,您将如何轻松提取一支球队在所有比赛中的表现数据?
CREATE TABLE students (  
    name text,
    contacts varchar ARRAY -- or varchar[]
);