我真的很难为使用SQL服务器的项目找到一个好的数据库设计。
我已经实现了一些在这一点上运行良好的模型,但现在我需要添加一些额外的东西,我找不到一个好的选择而且我坚持使用ATM。
我提供了以下2个非常简化的模型(类图)我试过,但两种模型都运行不正常。
第一个模型:,如果可以修复
,我也更喜欢我首先应该解释一下,msg和action可以具有相同的基本id(即1),但是当与tabID或groupID一起用作复合主键时,它将变得唯一。
在这里,您可以看到UserInput
仅使用基本ID创建,这会产生问题,例如保存{1}}和Msg
,ID为1。
有没有办法解决?也许可以说ya Action
和Action
正在扩展Msg
,但是他们自己定义了所有密钥?
第二个模型:
每个UserInput
都与Critical Point
或Msg
相关,但我如何定义它,因为它们有不同的PK集?我想保持推荐的完整性。
我真的很感谢这个问题的帮助。
答案 0 :(得分:1)
第一个模型的潜在修复
我不明白为什么Action
和Msg
可以拥有相同的ID。如果你想同样对待它们(如UserInput
)那么UserInput
表的id对它们来说都是唯一的。因此,UserInput
的每个ID代表Action
或Msg
。
我不知道这是否是一个很好的例子,但如果Action
和Msg
与Car
和Motorcycle
相似,那么我们仍然希望能够为了唯一地识别它们,所以它们在车牌上的id应该是唯一的,因此不应该存在于两个组中。
关键点是否需要知道它的用途?
如果没有,你只需要一个外键列" CriticalPointId"在你的UserInput
课程中。由于Action
和Msg
是子类,因此他们都可以访问CritialPoint
。
第二个模型的潜在修复
在此模型中,Msg
和Action
表中包含唯一ID。
在这方面,它与我对第一个模型的建议修复非常相似,期望不存在UserData
表。
如果Msg
和Action
没有任何共同点(第一个模型中UserData
除了ID之外没有属性),这可能是更好的解决方案。
假设CriticalPoint
不需要知道它使用的是什么对象,你只需要指定一个" CriticalPointId" Msg
和Action
表中的外键列。