我们使用在 Len Silverston 的 Data Model Resource Book Vol. 中找到的两种模式在 SQL Server 中构建了一个数据库。3,一个用于类型和类别:分类,另一个用于层次结构、聚合和对等关系。本质上,它的实现如下:
分类
[实体] (M x M) [EntityType] (M x M) [EntityTypeType]
...其中 (M x M) 是由分类表在数据库中实现的多对多关系。
协会
上面的实体和类型表也有自己的类型汇总:
- [实体] (M x M) [实体]
- [实体类型] (M x M) [实体类型]
- [EntityTypeType] (M x M) [EntityTypeType]
...其中每个 (M x M) 是在汇总表中实现的多对多关系,具有汇总/关联类型的外键。
由此产生的数据结构在描述我们的实体及其相互关系方面为我们提供了巨大的表达能力。但是,我们在应用程序中利用这种表现力时遇到了麻烦。主要问题是,尽管 EF 4 和 5 取得了进步,但 M-2-M 关系仍然很棘手,而且每当我们访问数据库时,我们都会尝试在至少 2 个方向上访问 M-2-M。尤其复杂的是:
- 我们对 [Entity] 和 [Entity] 的一些子类型进行子类型化。
- 所有 M2M 表 - 所有分类和汇总/关联表 - 都有一个有效负载,其中至少包含一个 From 和 Thru 日期。汇总还包含至少一个汇总类型。
- 我们不希望每次访问实体时都为了在运行时解释数据而加载输入模式的大而遥远的部分(EntityTypeType 表及其汇总)。
技术:
- SQL Server 2008 R2
- 实体框架 5
- .NET 4.5
- MVC 4(在网络应用部分,我们也有一些控制台应用)
关于模型本身的问题:
- 这仅仅是 .NET 中不可行的数据模型吗?
- 我们是否应该首先将我们的数据库扁平化为对我们的业务对象进行建模的对 .NET 更友好的视图?
关于打字方案的问题- 请记住,类型是相当静态的:
- 我们是否应该将 [EntityType] 和 [EntityTypeType] 表、它们的分类以及它们汇总到 C# 类中?这将类似于枚举脚手架,只是我们需要的不仅仅是名称/int,因为它们具有有效负载日期范围和类型有效负载。如果是这样,对于如何将这些文件构建为静态类的一些想法是什么?硬编码的对象列表?
- 我们是否应该在启动时缓存打字方案(这让我很困扰,因为它增加了启动控制台应用程序的大量开销)?
- 任何其他想法 - 脚手架 XML 文件?ETC...
非常感谢任何想法或经验!