如何处理关系数据库设计中的空列

How to handle null columns in a Relational Database Design

虽然主要使用 non-relational 数据库,但我需要换档并使用关系数据库,因为我需要构建的应用程序将 运行 复杂查询和 [=61= 之间的连接操作需要 ]s。

在开始创建数据库本身之前,我不得不考虑架构,并且我已经为数据库设计设置了一个 UML:

这就是 TransactionDEpositBreakdown table 的样子:

id  amount  date        reference_number  batch_id   payment_processor_id  mid_id  main_dep_id
1   100     2020-10-11  900               null       1                     100     2
2   101     2020-10-11  900               null       1                     100     2
3   102     2020-10-11  900               null       1                     100     1
4   103     2020-10-11  350               null       1                     100     1
5   104     2020-10-11  350               null       1                     100     3
6   105     2020-10-11  600               null       1                     100     4
7   106     2020-10-11  null              1000       2                     201     null
8   107     2020-10-11  null              1001       2                     201     null
9   108     2020-10-11  null              1002       2                     201     null
10  109     2020-10-11  null              1003       2                     201     null

有一个用例,其中 TransactionDepositBreakdown 可能有 reference numberbatch id,具体取决于支付处理器类型(类型 1 - 参考编号,类型 2 - 批处理) ID)。我不确定如何处理这种情况,但我正在考虑以下选项:

  1. 添加两个 tables TransactionDepositBatchTransactionDepositReferencetransaction_deposit_id 作为外键,batch_id 在第一个 table 和 reference_number 在后一个:

  1. reference_numberbatch_id 列保留在 TransactionDepositBreakdown table 中,并根据支付处理器类型始终保留其中之一 null .

注意:可能需要在 TransactionDepositBreakdown table 中添加另一列,例如 card_type,只有当支付处理器类型为1.

考虑到上述注意事项,第一个选项是否是处理此问题的正确方法?

此外,关于我构建的 UML 的任何建议都非常有用。

这些一对一的关系很难在关系数据库中建模。不同的数据库有不同的能力,所以有些可能有扩展可以应用到这个问题(比如Postgres对table继承的支持)。

你的情况很简单,只有两个选项。在这种情况下,出于一个简单的原因,我会选择第一个选项:它可以轻松地让您设计具有声明的外键关系的数据模型。缺点是两个外键都需要 space,即使其中一个是 NULL.

您也可以强制设置其中一个,但不能同时使用检查约束:

constraint chk_TransactionDepositBreakdown_reference_or_batch 
    check (reference_number is null or batch_id is null);