You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:13:28