【问题标题】:Boolean Look up Tables - Bool Column or Simple Lookup?布尔查找表 - 布尔列还是简单查找?
【发布时间】:2021-11-23 06:52:29
【问题描述】:

我们需要一个表来存储对合同副本的请求,比如说contract_copy_requests

用户要么提出请求,要么没有。该字段不太可能切换。

哪些列选项是“正确的”:

  1. profile_id, request date(并且只在此处写入发出请求的 id)或

  2. profile_id, has_requested_copy, updated_date

后者更完整和可扩展,但前者更简单,不需要为每个人提供可为空的字段或使用false 回填现有数据,因为他们还没有做出选择。

有什么真正的理由去做#2吗?顺便说一句,这更像是一个笼统的问题——在过去的一个月里,这个用例出现了大约 3 次,我总是倾向于 #1,但想验证它。

【问题讨论】:

  • 如果我们遵循 KISS 原则,选项#1 更好。但是,如果您预计逻辑中可能会有即将发生的变化,选项#2 可以提供更灵活的解决方案。如果不是后者,我会坚持使用选项#1。
  • 这两个替代方案实际上似乎不是替代方案。你说“为每个人用 false 回填现有数据”,但什么是“每个人”?与您有业务往来的所有人?地球上存在的每个人,你知道,你不知道?每个假设可能存在于整个宇宙中的人?似乎唯一现实的选择不是在两个不同的表之间,而是在一个表之间,另一方面在两个表之间。
  • 如果客户端发出第二个请求会发生什么?
  • @Belayer 我忽略了这种情况。禁止入内。基本上,如果有人关心,他们想要一份合同副本。如果我们真的不在乎他们请求了多少次,那么这两种选择是第二个条目,删除唯一约束,或者更新请求日期。管理层的指示是“我们甚至不需要存储选择,只需发送一个副本。”所以我在这里采用最简单的方法,因为我知道最终他们会要求报告有多少人要求这个,如果我们可以发送更正的文件等,等等。

标签: sql postgresql database-design


【解决方案1】:

第一个选项更好。

它更小,你不会失去任何功能:例如,很容易获得没有提出请求的用户:

... WHERE NOT EXISTS (SELECT 1 FROM contract_copy_requests AS ccr
                      WHERE ccr.request.id = /* column from the outside */)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-01
    • 2018-08-05
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多