在ERD和EF中建立这种关系的正确方法是什么?

时间:2014-06-09 14:57:08

标签: entity-framework erd table-per-type table-per-hierarchy

我正在为新系统设计一个全新的数据库模型。我的目标是将它存储在SQL中并通过Entity Framework映射到对象中。我大量使用Table-per-Hierarchy模式来支持复杂的对象层次结构并使其得到强制实施"正确"由数据库引擎。

我有以下情况,我不知道如何处理:

我有一组名为Resources的实体。每个资源都是特定类型,包含许多特定属性。

  • 资源(抽象类,映射到资源表)
  • 资源表有一个鉴别器列,一个ResourceId作为主键
  • 类如:ServerResource(具体类,继承自Resource,映射到UrlResources表,1-1到资源......总体上有关于dozehn其他资源类型(数量正在增长)
  • 每种类型的资源都有一组特定的属性 资源)

我还有许多名为Checks的实体。每个资源都包含许多检查。 ResourceId是Checks表中的外键。支票稍微有点儿。存在一些或所有类型的资源共有的检查类型。并且有一些Check类型非常特定于某些类型的资源。更确切地说:

  • 检查(抽象类,映射到Checks表,CheckId是主键)
  • OutageCheck(受大多数资源支持)
  • SslCertExpirationCheck(仅受一种资源支持)
  • 等。每种资源类型大约有3-4种类型的检查。其中1-2个在大多数资源中共享,而其余资源则根据特定资源进行自定义

所以,我的问题是如何映射ERD和Entity Framework中的Checks。最直接的方法是创建几十个表,每个表都有一个Resource类型和Check类型的特定组合。 IE:ServerOutageCheck,StorageOutageCheck,UrlOutageCheck,UrlSslExpiraitonCheck,ServerLowMemoryCheck等。

这似乎有点难以管理和维护。我希望能够在单个表中共享公共检查,特定于该公共检查(即:OutageCheck),并且仅偏离特定于资源的检查(即:SslExpirationCheck)。这可能吗?或者从表管理的角度来看,O ^ 2是我能做的最好的事情吗?

最后的想法。我的数据库是非常频繁的读取和非常不经常写入。如有必要,我也可以将读取的内容缓存出来。

1 个答案:

答案 0 :(得分:0)

我将推荐您使用三个标签,并建议您特别注意每个标签中的信息标签。

单表继承就像你标记的一样。 “信息”选项卡讨论了在单个简单表中包含大量NULLS所带来的欢乐和困境。

类表继承是一种替代方法,它只在属性有意义的表中放置属于某些子类的属性。

共享主键是一种设计技术,它允许您强制实现子类/超类关系的一对一性质,并且还为您提供了一种将特定数据与通用数据相结合的便捷方式。

我要说的大多数内容只会重复三个标签中信息标签中的内容。您也可以找到与您的案例相关的相关问题和答案。