主要观点:
- 最初的查询旨在获取用户账户及其关联 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 账户时,如果一个用户账户有多个账户会抛出错误。
- 强调添加断言不能替代正确的数据库设计,只是辅助发现问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。