首页 > 解决方案 > 设计数据库架构

问题描述

我在 Postgres 中有一个优惠券表,它有 50 多列。

数据库模式是这样的:

目前,restrict_to_user 字段存储一个 userId 数组,但是当restrict_to_user 字段变大时,在这种情况下查询会变慢。

如何将 restrict_to_user 字段存储在 DB 中。未来还会有更多类型的限制。如何处理它们?

标签: postgresqldatabase-design

解决方案


从数据一致性的角度来看,您可能希望规范化您的架构,而不是在数组中列出用户、酒店等。例如,在您的表coupons和表之间有一个连接表users,用于跟踪受限于特定优惠券的用户。您可以在优惠券和用户外键的组合上添加唯一约束以避免记录重复。使用数组方法,您很容易出现重复,因此您需要在查询中(例如unnest(),后跟 a group by)或在应用程序代码中处理您的数组。

在大规模情况下,可变长度类型的数组也存在潜在的性能问题。那就是如果你坚持text[]我怀疑应该是integer[]的。见https://heapanalytics.com/blog/engineering/dont-iterate-over-a-postgres-array-with-a-loop


推荐阅读