我需要实现具有1个基类和3个子类( 4个类)的解决方案
基类: 用户
子类: 客户端, OfficeUser ,员工
在我的数据库中,我只有3个表:用户,客户和员工。
我没有 OfficeUsers 表,因为我需要的所有数据都已存在于 Users 表中。
在将来,我希望能够创建报告lisitng客户端,员工和OfficeUser。
我不想使用TPH,因为我在Clients和Employees表中有很多不可为空的字段。
我应该只使用UserId创建 OfficeUsers 表,以便实现TPT吗?
它看起来不是很好的设计 - 只有PK表,所以我可以正确映射 - 请纠正我,如果这样做的话。
另一种选择是在 Users 表中使用 UserType 列并将其用作鉴别器,但它是否适用于TPT?是否有可能创建具有1个缺失表的TPT并使用鉴别器,看起来像混合TPT和TPH,我认为这是不可能的。
提前感谢您的回答。
修改
请同时考虑这种情况:
我正在引入一个名为MobileUser
的新类,它与User
具有相同的字段。在这种情况下,我无法知道系统有多少MobileUsers
和多少OfficeUsers
而没有为用户类型引入新列。
在这种情况下有2个空表(只有PK)比在我的查询中创建依赖关于表的数量更好/更差,并且另外阻止我使用一些LINQ查询(请参阅我在Ladislav Mrnka回答下的评论)
编辑2:
将来有可能我必须向OfficeUser
添加字段,所以我开始认为空表可以选择,至少C#代码(查询)看起来更干净。如果你有更好的方法,请告诉我。
答案 0 :(得分:0)
如果您的OfficeUser
与User
完全相同,那么您不需要任何其他课程。使用User
代替OfficeUser
以及Employee
和Client
的派生类
答案 1 :(得分:0)
我认为这只是一个透视问题,而不是一个建筑问题...因为无论你做什么,你最终都会得到一个PK表。
您可以制作 OfficeUsers 表,其中只包含用户的PK ...只是不要将其作为继承类型。现在您有一个使用办公室的所有用户的列表,您可以查询。结构完全相同,但思路有点不同。
如果您有多个办公室,那么您将拥有一个带有ID的办公室表,那么您的 OfficeUser 将拥有自己的类型表,因为额外的字段将是办公室外键。给你你想要的区别。
但是,因为你只(我认为)有一个办公室,你不需要一个外键,所以你只需要一个桌子来容纳使用办公室的用户...它是“6个,一半,半个十几个其他的“,无论你选择哪种方式,都完全相同。
这就是为什么我会在你的第二次编辑中使用你的直觉,你可能会在以后添加更多字段,所以你也可以制作一个“空”类型...因为无论哪种方式,你最终会得到一个只存储PK的表。