gpt4 book ai didi

c# - parent 和祖 parent 的外键

转载 作者:行者123 更新时间:2023-11-30 12:44:44 24 4
gpt4 key购买 nike

我有 3 个数据库表,分别名为“项目”、“契约(Contract)”和“事件”。该设计用于基于项目的维护系统。客户能够就维护各种设施的项目签订契约(Contract)。此外,与项目契约(Contract)可能相关或无关的孤立事件都应报告,例如安装缺陷。

项目与契约(Contract)是一对多的关系(每个项目可以有多个契约(Contract),也可以没有)。来自事件的记录最终必须可解决为项目,但并不总是需要存在契约(Contract)。在某些情况下,项目可能没有任何契约(Contract),但它应该能够有事件。

我们的数据库设计者建议事件持有项目和契约(Contract)的外键。实际上,这是一种关系,它具有指向 parent 和祖 parent 的单独键,以允许没有 parent 记录。另一种方法是创建一个“虚拟”契约(Contract)。这两种解决方案都不是我的偏好。

更糟糕的是,契约(Contract)还引用了另一个表中的“债务人”。因此,在没有契约(Contract)的情况下,事件也应该能够引用债务人。

我不禁觉得所提议的方法违反了所有正常形式,并且有可能在未来产生问题,包括成为维护问题,因此我正在寻找一种能够在整个过程中保持完整性的替代解决方案 table 。此外,是否有人熟悉此方法可能导致的其他问题?

无论如何,我是负责编写将使用该数据库的应用程序的开发人员。该项目将使用 LINQ over SQL 在 WPF 中创建。一个要求是它应该能够查询项目记录以了解所有事件,包括通过契约(Contract)引用的事件。

我在SO上找过类似的问题,虽然有很多处理祖 parent 键的问题,但似乎没有一个符合我的问题。

最佳答案

这是一个更简单的方法。为每个项目制定一个虚拟契约(Contract),用于没有正式契约(Contract)的事件。该契约(Contract)将始终用于解决项目。

这简化了数据库设计,但确实引入了其他问题。例如,要查找没有契约(Contract)的事件,您不会在契约(Contract)列中查找 NULL。您会在契约(Contract)表中寻找“不是真正的契约(Contract)”。根据具体情况,这可能是一个更优雅的解决方案。这也解决了 Debtor 的问题。

这确实带来了另一个问题,即可能出现在多个契约(Contract)上的事件。事实上,您最终可能会朝着需要支持另一个表的方向前进,该表是事件和项目之间的 n-m 映射。

关于c# - parent 和祖 parent 的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27382200/

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