gpt4 book ai didi

sql-server - 一对多连接表以避免可为空的列

转载 作者:行者123 更新时间:2023-12-04 02:13:07 24 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它.

8 天前关闭。




Improve this question




我想知道自己是否是第一个为这个问题苦苦挣扎的程序员,但我在 SO 中找不到任何关于此的内容。

我的问题是,制作一对多连接表是一个好主意,以防止空引用。

让我们解释一下,在我们的业务需求中,我们有一些导致付款的事件,即销售、贷款、租金、服务等。每个事件可以有零个或一个或多个付款。

在设计数据库时,我们有每个事件的表,销售 - 贷款 - 租金 - 服务等,以及一个付款表。事件与付款之间的关系是一对多的,每笔贷款可以有很多付款,每笔租金可以有很多付款。

但是有一个问题,每次付款都可以是贷款或销售或任何其他事件,我们需要将其与其对应的事件相关联。我想了两个选择:

1) 在 Payments 表中为每种事件添加一些外键,LoanID - RentID - ServiceID 等。并使它们为 Nullable,因为贷款既不是服务也不是租金。

我个人不喜欢这个解决方案,它很容易出错,因为它是 Nullable,所以很容易忘记添加匹配的 FK,然后我们不知道这笔付款是关于什么的,我们失去了参照完整性。虽然可以通过创建一些约束来确保没有多于或少于一个 FK 来克服这个问题,但是创建正确的约束并考虑所有可能的选项并不是那么容易,而且很难重新创建添加新的 FK 列时的约束。

这样一张 table 的丑陋就不用说了。不要谈论让表中不必要的可空列的主要问题。

2)第二种解决方案,为每种事件创建连接表,称为 ActivityPayments 即 LoanPayments 等,它包含事件 ID 和支付 ID,如多对多表。

没有上面描述的问题,每次付款都与其对应的事件相关,没有参照完整性损失,没有 Nullable 列。
然而,问题在于它扩大了数据库,并在表之间添加了另一层,并且在加入查询时需要更多的工作。

有人知道吗?

最佳答案

另一种选择是创建一个父类(super class)型表,比如 Activity,它具有所有公共(public)属性:

enter image description here

这应该保持表的数量很小,并且仍然允许您识别付款的事件类型。请注意,这假设不同事件之间存在共同属性。如果不是这种情况,您列出的第二个选项可能是要走的路。

关于sql-server - 一对多连接表以避免可为空的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36535761/

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