gpt4 book ai didi

SQL 数据库规范化和外键实践(可变/空白键?)

转载 作者:行者123 更新时间:2023-12-01 12:48:08 26 4
gpt4 key购买 nike

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

我有 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。创建引用个人或公司的单个表:

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

最佳答案

在我看来,没有明显的最佳或最差答案,各有利弊。以下是需要考虑的几点:

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

解决方案 2 - 如您所说,非常适合存储数据,但不适合查询数据。以下哪一项对您的应用更重要?

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

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

关于SQL 数据库规范化和外键实践(可变/空白键?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14146825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com