【问题标题】:PostgreSQL field type to store string, int, or jsonPostgreSQL 字段类型,用于存储字符串、int 或 json
【发布时间】:2021-02-07 04:55:49
【问题描述】:

我想为具有如下表定义的变量存储一个表

variable
--------
id           int
var_type     int  0: number, 1: string, 2: json
var_name     int
var_value    ??? varchar or jsonb?

如果我使用varchar,如何存储json类型变量,如果我使用jsonb,如何存储int和string?

存储的示例 json 值,

[{"name": "Andy", "email" : "andy@mail.id"},{"name": "Cindy", "email" : "cindy@mail.id"}]

TIA

贝尼

【问题讨论】:

  • 变量类型并不是关系模式所擅长的。如果可能,尽量避免它。为什么不简单地拥有一个 name 和一个 email 列,每个列都有适当的类型?
  • 这个想法是有一个可以是数字、字符串或json(数组)的变量。 name 和 email aboce 的例子只是一个例子。它可以是任何东西,[{'first_name' : 'Andy', 'last_name' : 'Robertson'}, {'first_name' : 'Cindy', 'last_name' : 'McGill'}]。

标签: postgresql jsonb


【解决方案1】:

当您有数据但不知道结构时,请使用单个 jsonb 列。 JSON 可以处理字符串、数字等 JSON。

{
  "string": "basset hounds got long ears",
  "number": 23.42,
  "json": [1,2,3,4,5]
}

不要试图将它们全部塞进一个数组中。将它们放在不同的行中。

  • 一行:{"name": "Andy", "email" : "andy@mail.id"}
  • 另一行:{"name": "Cindy", "email" : "cindy@mail.id"}

但是,您的示例感觉像是在避免设计架构。 JSONB 很有用,但过度使用它会破坏relational database 的意义。

create table people (
  id bigserial primary key,

  // Columns for known keys which can have constraints.
  name text not null,
  email text not null,

  // JSONB for extra keys you can't predict.
  data jsonb
)

使用JSON operators 查询单个对。

select
  name, email, data->>'favorite dog breed'
from some_table

【讨论】:

  • 感谢您的解释。问题是姓名和电子邮件不存在,因为它们永久存在。另一个 JSON 类型变量是 [{'first_name' : 'Andy', 'last_name' : 'Robertson'}, {'first_name' : 'Cindy', 'last_name' : 'McGill'}]。
  • 如果我存储为 varchar,如何将此 varchar 转换为 var_type 为 json 的 json?
  • @BenySetiawan 不要将其存储为 varchar,对所有内容使用单个 jsonb 列。
  • @BenySetiawan Here's an example。同样,我建议您在将所有内容都放入 jsonb 之前考虑更传统的表结构。
  • 非常感谢@Schwern。我按照你的建议将重要的东西移到一个字段中,只在 jsonb 字段中保留非结构化字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多