为我的项目找到一个好的数据库设计

时间:2015-10-25 09:09:31

标签: sql-server entity-framework database-design ef-code-first

我真的很难为使用SQL服务器的项目找到一个好的数据库设计。

我已经实现了一些在这一点上运行良好的模型,但现在我需要添加一些额外的东西,我找不到一个好的选择而且我坚持使用ATM。

我提供了以下2个非常简化的模型(类图)我试过,但两种模型都运行不正常。

第一个模型:,如果可以修复

,我也更喜欢

1st model

我首先应该解释一下,msg和action可以具有相同的基本id(即1),但是当与tabID或groupID一起用作复合主键时,它将变得唯一。

在这里,您可以看到UserInput仅使用基本ID创建,这会产生问题,例如保存{1}}和Msg,ID为1。 有没有办法解决?也许可以说ya ActionAction正在扩展Msg,但是他们自己定义了所有密钥?

第二个模型:

class diagram

每个UserInput都与Critical PointMsg相关,但我如何定义它,因为它们有不同的PK集?我想保持推荐的完整性。

我真的很感谢这个问题的帮助。

1 个答案:

答案 0 :(得分:1)

第一个模型的潜在修复

我不明白为什么ActionMsg可以拥有相同的ID。如果你想同样对待它们(如UserInput)那么UserInput表的id对它们来说都是唯一的。因此,UserInput的每个ID代表ActionMsg

我不知道这是否是一个很好的例子,但如果ActionMsgCarMotorcycle相似,那么我们仍然希望能够为了唯一地识别它们,所以它们在车牌上的id应该是唯一的,因此不应该存在于两个组中。

关键点是否需要知道它的用途? 如果没有,你只需要一个外键列" CriticalPointId"在你的UserInput课程中。由于ActionMsg是子类,因此他们都可以访问CritialPoint


第二个模型的潜在修复

在此模型中,MsgAction表中包含唯一ID。 在这方面,它与我对第一个模型的建议修复非常相似,期望不存在UserData表。

如果MsgAction没有任何共同点(第一个模型中UserData除了ID之外没有属性),这可能是更好的解决方案。

假设CriticalPoint不需要知道它使用的是什么对象,你只需要指定一个" CriticalPointId" MsgAction表中的外键列。