我正在为我的公司设计一个数据库来管理商业贷款。每笔贷款都可以有担保人,可以是个人或公司,以防借贷业务失败。
我有 3 个表:Loan、Person 和 Company,它们存储显而易见的信息。我的困境是如何定义贷款与个人或公司之间的关系,以了解每笔贷款的担保人。我可以看到三种方法来做到这一点:
1. 为所有个人或公司担保人创建一个表 Guarantor:
Guarantor:
pkGuarantorID (int, primarykey)
fkLoanID (foreign key mapping to the primary key of a row in Loan)
fkPersonID (foreign key mapping to the primary key of a row in Person)
fkCompanyID (foreign key mapping to the primary key of a row in Company)
这种方法的问题是其中一个外键总是空白的,因为担保人只能是个人或公司,不能同时是两者。
2. 创建两个新表 Loan_Person 和 Loan_Company,分别代表两种不同的担保人:
Loan_Person:
pkLoan_PersonID (primary key)
fkLoanID (foreign key mapping to the primary key of a row in Loan)
fkPersonID (foreign key mapping to the primary key of a row in Person)
Loan_Company:
pkLoan_CompanyID (primary key)
fkLoanID (foreign key mapping to the primary key of a row in Loan)
fkCmpanyID (foreign key mapping to the primary key of a row in Company)
虽然显然更规范化并且可能是更好的选择,但这需要更多的逻辑来选择并正确组合或显示结果。
3. 创建一个引用 Person 或 Company 的表:
Guarantor:
pkGuarantorID (primary key)
GuarantorType (signifies either Individual or Company)
fkGuarantorKey (foreign key mapping to a primary key in Person if GuarantorType is Individual, or mapping to a primary key in Company if GuarantorType is Company)
这似乎也是一个不错的选择,但需要在执行任何 JOIN 之前检查 GuarantorType 的值的额外步骤。
有人对采用哪种方法有任何建议吗?我希望听到有类似情况的人的意见,这样我就知道将来可能会产生或避免哪些头痛。
非常感谢您花时间看这个!
编辑:任何有类似问题的人,除了来自@RBarryYoung 的链接,也可能会发现这些问题很有用: