在Prisma中实现PostgreSQL元组型查看记录追踪的最佳实践
解决Prisma不支持PostgreSQL自定义复合类型的替代方案
你的需求是追踪帖子的查看记录(用户ID+查看日期),原本想用PostgreSQL的自定义复合类型CREATE TYPE foo AS (id INT, date DATE)实现,但Prisma暂不支持这类复合类型,下面分析你考虑的三个选项:
选项1:新增独立关联表
这是最符合关系型数据库设计规范的方案,也是你最终选择的方式。
- 设计一张
post_views表,包含核心字段:post_id(关联posts表的外键)viewer_id(查看用户的ID)view_date(查看日期)- 可给
post_id+viewer_id设置联合唯一约束,避免重复记录同一用户多次查看同一帖子(若需允许重复则不加)
- 核心优势:
- 数据结构清晰合规,便于后续复杂查询(比如统计单帖查看人数、用户历史浏览记录)
- Prisma完全支持这类关联关系,能自动生成对应模型和CRUD操作
- 数据类型严格可控,不会出现格式错误
选项2:使用JSON/JSONB类型
在posts表中新增一列(比如view_records),类型设为JSONB(PostgreSQL推荐用JSONB,支持索引),存储格式类似[{"id": 1, "date": "2024-05-20"}, {"id": 2, "date": "2024-05-21"}]
- 优势:实现简单,无需新增表
- 劣势:
- 数据约束弱,可能存入格式错误的内容(比如缺失字段、类型不匹配)
- 查询逻辑复杂,统计或筛选时需依赖JSON函数,效率远低于关联表
- Prisma对JSON类型支持有限,复杂操作需手写Raw SQL或手动处理数据
选项3:Raw类型(不推荐)
Prisma的Raw类型多用于直接执行原生SQL或映射小众数据库类型,但对你的需求完全没必要:
- 需手动编写大量原生SQL,丢失了Prisma ORM的便捷性
- 维护成本高,后续模型变更、数据迁移容易出问题
最终结论(与你的选择一致)
新增post_views关联表是最优解,既符合关系型数据库设计原则,又能完美适配Prisma的功能,后续扩展和查询都更顺畅。
内容的提问来源于stack exchange,提问作者Emil Wormbs
相关产品推荐
相关产品推荐

