3

我正在为我的公司设计一个数据库来管理商业贷款。每笔贷款都可以有担保人,可以是个人或公司,以防借贷业务失败。

我有 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 的链接,也可能会发现这些问题很有用:

4

2 回答 2

2

这就是所谓的“类别关系”或(今天更常见的)“多表继承”。根据约束条件,至少有三种不同的可行方法来实施一种方法。这篇文章在这里:http ://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server 很好地解释了如何实现它们。

于 2013-01-03T20:52:38.137 回答
2

在我看来,没有明显的最佳或最差答案,每个都有其优点和缺点。这里有几点需要考虑:

解决方案 1 - 可以使用CHECK约束来保证数据完整性,以强制填充一个 FK 值。

解决方案 2 - 正如您所说,非常适合存储数据,而不适合查询数据。其中哪一个对您的应用程序更重要?

解决方案 3 - 这可行,但您将无法在 上定义 FK 约束fkGuarantorKey,这将导致数据完整性问题。如果我必须选择一个“最差”的解决方案,就是这样。

解决方案 4 - 您还可以考虑将PersonCompany表合并到一个LegalEntity表中,并为仅限个人和仅限公司的数据设置子表。然后,您的Guarantor表将简化为具有两个 FK 的简单多对多链接表。如果您的产品的许多部分必须以相同的方式与人或公司打交道,这是一个很好的解决方案。然而,如果你的产品总是以不同的方式对待人和公司,那么它就不那么实用了。

于 2013-01-03T20:48:42.937 回答