我有3个名为“Projects”,“Contracts”和“Incidents”的数据库表.该设计用于基于项目的维护系统.客户能够在项目上建立合同以维护各种安装.此外,可能或可能与项目合同无关的孤立事件应该是可报告的,例如有缺陷的安装.
项目与合同具有1对多的关系(每个项目可以有多个合同,或者没有合同).来自事故的记录最终必须可以解析为项目,但并不总是要求合同存在.在某些情况下,项目可能没有任何合同,但它应该能够发生事故.
我们的数据库设计师建议事件持有项目和合同的外键.实际上,这是一种与父母和祖父母分开的关系,以允许没有父记录.
另一种方法是创建一个“虚拟”合同.这两种方案都没有我的偏好.
更糟糕的是,合同还引用了另一个表中的“债务人”.因此,在没有合同的情况下,事件也应该能够引用债务人.
我不禁感到提议的方法违反了所有正常形式,并且有可能产生未来的问题,包括成为维护问题,因此我正在寻找一种能够在整个表格中保持完整性的替代解决方案.另外,是否有人熟悉这种方法可能导致的其他问题?
对于它的价值,我是负责编写将与该数据库一起使用的应用程序的开发人员.该项目将在WPF中使用LINQ over sql创建.一个要求是它应该能够查询项目记录中的所有事件,包括通过合同引用的事件.
我在SO上寻找过类似的问题,尽管有许多处理祖父母的密钥,但它们似乎都不符合我的问题.