如何在Postgresql中存储列表?

4

在PostgreSQL中,存储列表的最佳方式是什么?我需要使用哪种字段类型?需要对其进行序列化吗?

以下是我想要存储的数据示例:

id(数字),name(文本),events(列表)

1, john connor, ["aaa","bbb","ccc"]

2, jack bush, ["ttt","hhh","lll"]

...

2
你不需要这样做。你需要创建另一张表格,并且通过外键将其连接到主表格。这是一个相当标准的父-子数据库关系。 - Alejandro
@Alejandro 我连将列表序列化并存储到列中都不行吗? - xRobot
5
可以这样做,但它违反了数据库规范化的最佳实践。 - user330315
@xRobot 当然可以,你可以保存包含任何内容的字符串,但这样做将会在以后导致许多问题。使用另一个表格并避免麻烦。 - Alejandro
@xRobot 所有的关系数据库管理系统都是基于“规范化”(去谷歌搜索吧,你会找到很多相关内容)的概念。第一步是称为第一范式(1NF),其中的一部分是删除所有重复的组。任何类型的数组或列表都违反了这个原则。这只会导致日后的维护和数据问题。正如前文提到的,将您的列表提取到另一个表中,并设置一个值列。您可以通过查询重新构建列表或数组,但要避免使用列表或数组带来的数据异常。 - Belayer
2个回答

8
如何使用数组呢?它们可以用[]声明任意大小的数组,或者用[3]声明有三个元素的数组。
CREATE TABLE test1 (
  id integer,
  name text,
  events text[]);
  
INSERT into test1 (id, name, events)
    values(1, 'john connor', '{"aaa", "bbb","ccc"}'),
          (2, 'jack bush', '{"ttt", "hhh","lll"}');

在输入数组时,所有内容都必须用花括号括起来,同时花括号必须用单引号括起来。最后,数组中的字符串必须使用双引号。

下面是表格的样子:

id  name            events
1   john connor     {aaa,bbb,ccc}
2   jack bush       {ttt,hhh,lll}

很好,PostgreSQL中使用数组有限制吗? - xRobot
2
@xrobot,我还没有遇到使用数组时的重大缺点。当您需要检索数据时,您在使用数组函数重新排列数据方面会受到一定限制。 - bfris

-1
使用 JSON 示例。
select
    json_build_object(
        user_id,
        json_build_object(
            'user_name',
            table.user_name
            'aaa',
            table.aaa,
            'bbb',
            table.bbb,
            'ccc',
            table.ccc
        )
 )
from table

2
请在您的答案中提供更多细节。目前的写法很难理解您的解决方案。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接