如何处理关系数据库设计中的空列
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
- 一个
reference_number
可以分配给多个交易入金明细
- A
batch_id
仅分配给一个交易存款明细
有一个用例,其中 TransactionDepositBreakdown
可能有 reference number
或 batch id
,具体取决于支付处理器类型(类型 1 - 参考编号,类型 2 - 批处理) ID)。我不确定如何处理这种情况,但我正在考虑以下选项:
- 添加两个 tables
TransactionDepositBatch
和 TransactionDepositReference
将 transaction_deposit_id
作为外键,batch_id
在第一个 table 和 reference_number
在后一个:
- 将
reference_number
和 batch_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);
虽然主要使用 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
- 一个
reference_number
可以分配给多个交易入金明细 - A
batch_id
仅分配给一个交易存款明细
有一个用例,其中 TransactionDepositBreakdown
可能有 reference number
或 batch id
,具体取决于支付处理器类型(类型 1 - 参考编号,类型 2 - 批处理) ID)。我不确定如何处理这种情况,但我正在考虑以下选项:
- 添加两个 tables
TransactionDepositBatch
和TransactionDepositReference
将transaction_deposit_id
作为外键,batch_id
在第一个 table 和reference_number
在后一个:
- 将
reference_number
和batch_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);