PostgreSQL 中原生断言的案例

主要观点:

  • 最初的查询旨在获取用户账户及其关联 HubSpot 账户的列表,但假设了用户账户和 HubSpot 账户之间是一对一关系,此假设在未来可能不成立。
  • DISTINCT ON在这种情况下更危险,会为每个用户账户返回一个随机的 HubSpot 账户,不易察觉问题。
  • 不推荐上述模式,应在user_account表中添加存储hubspot_account表外键的列,在数据库级别强制一对一关系。
  • 提出 PostgreSQL 的新特性“原生断言”,可在查询中添加运行时检查的断言,使查询中的假设明确,如在查询中添加ASSERT ua1.id IS UNIQUE
  • 另一种类似方法是使用子查询获取每个用户账户的 HubSpot 账户,但有性能和可组合性方面的权衡。
  • 客户端断言对解决子查询问题无效,添加断言不能替代适当的数据库设计,但能更易发现查询中隐式假设导致的错误。

关键信息:

  • 给出的查询示例及其中的表关联和字段。
  • 不同方法的优缺点,如DISTINCT ON的危险性、子查询的性能和可组合性问题。
  • 提议的 PostgreSQL 原生断言特性及其用法。

重要细节:

  • 提到hubspot_account表可能通过hubspot_account.user_account_id列的唯一约束来记录一对一关系。
  • 子查询在获取 HubSpot 账户时,如果一个用户账户有多个账户会抛出错误。
  • 强调添加断言不能替代正确的数据库设计,只是辅助发现问题。
阅读 32
0 条评论