繁体   English   中英

选择正确的实体关系方法

[英]Choosing the right entity relations approach

假设我有一个用户表和角色表

我有两种角色类型,员工和雇主

在用户表中,我有以下几列

  • 用户身份

    名字

    RoleId(外键-一对多)

雇主可以拥有相关的公司,而雇员可以拥有相关的简历

因此,最好是定义另外两个与用户表具有一对一关系的表(Employee,Employer),并在其中具有Company / CV外键,还是最好像这样定义User表

  • 用户身份

    名字

    CompanyId-员工留空(允许为null)

    CVId-雇主留空(允许为空)

    角色编号

我正在考虑添加两个其他表(员工和雇主),这似乎更合理,但是角色表的用途是什么,并且留空似乎是可行的方法,只是在添加时不显示字段/编辑新员工/雇主...但是我不确定这样做时是否有安全隐患/缺点,这就是为什么我想向你们寻求建议

两种方法都是在数据模型上实现继承的常见策略,第一种称为TPT(每个类型的表),第二种称为TPH(每个层次的表)。

这是一篇很棒的文章,介绍并比较了这两种策略http://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspx

哪种策略是最好的? 技巧问题! 孤立您的需求时,没有“最佳”策略。 以下是您在做出决定时可能要考虑的一些事项:

  • 性能:每个层次的表通常具有更好的性能,因为不需要任何联接,所有内容都在一个表中。 一旦继承层次变得广泛或深入,决策就变得更加清晰。
  • 灵活性:ISV通常使用“每种类型的表”,因为它允许自定义而无需修改“基本”表。 也就是说,只需为这些子类型创建新表即可添加新的子类型。
  • 数据库验证:TPH要求派生类型中的列在数据库中为NULLABLE,以便其他派生类型可以存储在同一表中。 因此,可以根据概念模型在表中创建无效的行。 也就是说,该列为NULLABLE,但是特定列为NULL和特定区分符或类型的组合无效。 这意味着数据库不再为您实施概念模型。 如果所有对数据库的访问都是通过EF进行的,那很好,但是如果使用了其他任何方法,最终可能会得到“脏”数据。
  • 美学:这完全是主观的,但是TPT对我来说更像是面向对象的:)
  • 存储空间:如果您的继承层次结构有很多类型,那么使用TPH将导致很多空单元格。 如果您的数据库可以很好地处理“稀疏”列,那么这可能不是真正的问题。

正如您所看到的,一旦知道要寻找的是什么,选择策略应该是一件很容易的事情。 在大多数情况下,建议使用TPH,因为通常情况下,性能胜过其他方面的考虑。 但是每种情况都是不同的,关键是要准确地了解您的价值,然后做出相应的决定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM