首页 > 解决方案 > 在 postgresql 中以 json 格式存储数据是一种好习惯吗?

问题描述

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

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

我选择将这些信息存储在 PostgreSql 中。我有一个表 Order 与 OrderTransaction 的关系,到一个 OrderItem 表关系,它本身链接到 Item 表整个订单......)和折扣值),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[];

}

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

谢谢!

标签: sqljsonpostgresqldatabase-design

解决方案


不,这不是好的做法。

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

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


推荐阅读