【发布时间】: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