如何在一列中存储数组或多个值

Phi*_*ord 32 sql arrays postgresql types

运行Postgres 7.4(是的,我们正在升级)

我需要将1到100个选定项目存储到数据库中的一个字段中.98%的时间只是输入1个项目,2%的时间(如果有的话)会有多个项目.

这些项目只不过是一个文本描述(截至目前),不超过30个字符.它们是用户选择的静态值.

想知道用于存储所需数据的最佳列数据类型.我在想BLOB,但不知道这是不是太过分了.也许是JSON?

我也想到了ENUM但是到目前为止我还不能真正做到这一点,因为我们运行的是Postgres 7.4

我还希望能够轻松识别输入的项目,因此没有映射或引用表格.

cwa*_*ole 43

你在这里有几个问题,所以我将分别解决它们:

我需要在数据库的一个字段中存储许多选定的项目

我的一般规则是:不要.这是所有但需要第二个表(或第三个)与外键的东西.当然,现在看起来似乎更容易了,但如果用例出现在您需要单独查询这些项目的情况下呢?这也意味着您有更多的懒惰实例化选项,并且您可以跨多个框架/语言获得更一致的体验.此外,您不太可能遇到连接超时问题(30,000个字符很多).

您提到您正在考虑使用ENUM.这些值是固定的吗?你提前知道吗?如果是这样,这将是我的结构:

基表(你现在拥有的):

| id primary_key sequence
| -- other columns here.
Run Code Online (Sandbox Code Playgroud)

物品表:

| id primary_key sequence
| descript VARCHAR(30) UNIQUE
Run Code Online (Sandbox Code Playgroud)

地图表:

| base_id  bigint
| items_id bigint
Run Code Online (Sandbox Code Playgroud)

映射表将具有外键,因此base_id映射到Base表,items_id将映射到items表.

如果您想要一种从数据库中检索此方法的简单方法,那么创建一个执行连接的视图.您甚至可以创建插入和更新规则,这样您实际上只处理一个表.

我应该使用什么格式存储数据?

如果你必须做这样的事情,为什么不只是使用字符描绘的字符串?它比CSV,XML或JSON需要更少的处理能力,而且会更短.

我应该使用哪种列类型存储数据?

就个人而言,我会用TEXT.这听起来并不像你通过制作它获得了很多BLOB,而且TEXT,根据我的经验,如果你使用某种形式的IDE,它会更容易阅读.

  • 如果可以,与将“基表”的主键直接保存为“项目表”中的行上的列相比,使用“映射表”有什么好处? (2认同)

Den*_*rdy 7

好吧,最近的Postgres版本中有一个数组类型(不是100%关于PG 7.4).您甚至可以使用GIN或GIST索引对它们进行索引.语法是:

create table foo (
  bar  int[] default '{}'
);

select * from foo where bar && array[1] -- equivalent to bar && '{1}'::int[]

create index on foo using gin (bar); -- allows to use an index in the above query
Run Code Online (Sandbox Code Playgroud)

但正如先前的答案所表明的那样,正确地进行正常化会更好.