postgresql - 设计数据库架构
问题描述
我在 Postgres 中有一个优惠券表,它有 50 多列。
数据库模式是这样的:
- 标识:字符串,
- 代码:字符串,
- restrict_to_user : text[] // 一个数组,存储优惠券对其有效的用户的个人资料 ID,
- restrict_to_hotel : text[] // 优惠券有效的酒店数组以及更多条目。
目前,restrict_to_user 字段存储一个 userId 数组,但是当restrict_to_user 字段变大时,在这种情况下查询会变慢。
如何将 restrict_to_user 字段存储在 DB 中。未来还会有更多类型的限制。如何处理它们?
解决方案
从数据一致性的角度来看,您可能希望规范化您的架构,而不是在数组中列出用户、酒店等。例如,在您的表coupons
和表之间有一个连接表users
,用于跟踪受限于特定优惠券的用户。您可以在优惠券和用户外键的组合上添加唯一约束以避免记录重复。使用数组方法,您很容易出现重复,因此您需要在查询中(例如unnest()
,后跟 a group by
)或在应用程序代码中处理您的数组。
在大规模情况下,可变长度类型的数组也存在潜在的性能问题。那就是如果你坚持text[]
我怀疑应该是integer[]
的。见https://heapanalytics.com/blog/engineering/dont-iterate-over-a-postgres-array-with-a-loop
推荐阅读
- matlab - cvpartition 和 crossvalind 有什么区别
- php - Laravel 5.6将电子邮件字段名称更改为忘记密码的用户名
- python - DataFlow 使用 Airflow DataflowHook.start_python_dataflow 失败并返回代码 1
- python - 分布的迭代排列
- r - 在 pmin 中使用 na.rm=T 和 do.call
- php - 如何获取没有完整路径名的目录树迭代器的目录
- kotlin - Kotlin - 获取可空泛型类型推断的不可空推断
- nfc - Android Wear 上的 NFC 阅读器模式
- ruby-on-rails - 我正在尝试在数字海洋中部署,当最后一部分到达 ActiveSupport::MessageEncryptor::InvalidMessage
- javascript - onunload 如何影响页面性能