【问题标题】:Is it a good practice to store data in json format in the postgresql?在 postgresql 中以 json 格式存储数据是一种好习惯吗?
【发布时间】:2021-08-17 00:35:47
【问题描述】:

在我的最新项目中,我存储了历史餐厅订单,其中包含总价、交易增值税、订单中购买的商品、这些商品的价格等字段。

我还存储有折扣的餐厅提供的优惠、优惠中包含的项目、符合受众条件的受众。 一旦获取订单或报价数据,将不会被编辑或更新。

我选择将这些信息存储在 PostgreSql 中。 我有一个与 OrderTransaction 有关系的表 Order,与一个 OrderItem Table 关系本身链接到 Item Table 我有一个表 Offer 链接到多个表:OfferDiscount(代表类型(买 1 送 1,整个订单的统一折扣......)和折扣值),OfferAudience,代表

大多数查询需要加载 Order 的项目和 Offer 的所有关系。 这些表并发写入的风险不高。

我是否应该直接在主表(订单、报价)中以 postgre Json 格式序列化来自这些关系的信息,以便更快地访问和简化。 这也将有助于这样一个事实,例如,如果 OfferDiscount 行被删除,这不会影响过去的 Offer 数据,这些数据还会直接在其行中包含来自 OfferDiscount 的一些字段。

目前我有:

@Entity()
class Order {
  @PrimaryGeneratedColumn()
  public id?: number;

  @Column()
  public total: number;

  @Column()
  public discount: number;

  // TODO : Serialize ?
  @OneToMany(() => OrderItem, (orderItem) => orderItem.order)
  public items: OrderItem[];

  // TODO : Serialize ?
  @OneToMany(
    () => OrderTransaction,
    (orderTransaction) => orderTransaction.order
  )
  public transactions: OrderTransaction[];

}

我被建议按照以下顺序序列化数据,因为一旦创建订单就不会改变:

@Entity()
class Order {
  @PrimaryGeneratedColumn()
  public id?: number;

  @Column()
  public total: number;

  @Column()
  public discount: number;

  @OneToMany(() => OrderItem, (orderItem) => orderItem.order)
  public items: OrderItem[];

  @Column({type: 'jsonb', array: true, nullable: true})
  contentItems: object[];

  @OneToMany(
    () => OrderTransaction,
    (orderTransaction) => orderTransaction.order
  )
  public transactions: OrderTransaction[];

  @Column({type: 'jsonb', array: true, nullable: true})
  contentTransactions: object[];

}

这样存储数据是一种好习惯吗,因为它确实可以简化查询,只获取一个没有所有关系的表,并防止在关系行发生更改时丢失原始数据。

谢谢!

【问题讨论】:

  • 只要将 JSON 文档视为单个实体,不需要对其进行复杂的编辑,就可以了。现在,如果您想将其视为经常更改的免费数据结构,那么它可能会成为一个问题。
  • “以及在删除关系时防止数据丢失”,只有当您不使用外键约束等安全带时才会发生这种情况。或者一个 drop 数据库,但是那个命令也不会保护你的 json。关系数据库在维护关系方面非常好
  • 我进行了编辑以更具体地说明数据丢失。我所说的数据丢失的意思是不应该在我的示例中对相关 OrderItems 的字段进行编辑。我只写数据而不更新数据。因此将原始信息存储在json中。

标签: sql json postgresql database-design


【解决方案1】:

不,这不是好习惯。

创建几个具有外键关系和常规数据类型的规范化表,并以这种方式存储数据。这将使 SQL 语句更简单,从而带来更好的性能。

关系数据库已针对连接具有多行的表进行了优化。

【讨论】:

    猜你喜欢
    • 2020-09-10
    • 2018-12-12
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    相关资源
    最近更新 更多