探索在运行时键入模式的数据库

时间:2013-02-23 15:12:55

标签: caching database-design entity-framework-5 scaffolding

我们使用Len Silverston的Data Model Resource Book Vol中的两种模式在SQL Server中构建了一个数据库。 3,类型和类别之一:分类,另一个用于层次结构,聚合和点对点关系。从本质上讲,它的含义如下:

分类

[实体](M x M)[实体类型](M x M)[实体类型]

...其中(M x M)是分类表在数据库中实现的多对多关系。

协会

上面的实体和类型表也有自己的类型化汇总:

  • [实体](M x M)[实体]
  • [EntityType](M x M)[EntityType]
  • [EntityTypeType](M x M)[EntityTypeType]

...其中每个(M x M)是在Rollup表中实现的多对多关系,其中包含汇总/关联类型的外键。

由此产生的数据结构在描述我们的实体及其相互关系方面为我们提供了极大的表达能力。但是,我们在应用程序中无法利用这种表现力。主要问题是,尽管EF 4& 5,M-2-M关系仍然很棘手,除此之外我们试图在我们到达数据库时至少在两个方向上访问M-2-M。特别复杂的是:

  1. 我们对[实体]和[实体]的某些子类型进行了子类型化。
  2. 所有M2M表 - 所有分类和汇总/关联表 - 都有一个至少包含From和Thru日期的有效负载。汇总也至少包含汇总类型。
  3. 我们不希望必须加载大型远程部分的输入模式(EntityTypeType表及其汇总),以便在每次访问实体时在运行时解释数据。
  4. 技术

    • SQL Server 2008 R2
    • 实体框架5
    • .NET 4.5
    • MVC 4(在网络应用程序部分,我们还有一些控制台应用程序)

    有关模型本身的问题:

    • 这只是.NET中一种不可行的数据模型吗?
    • 我们是否应该首先将我们的数据库展平为更多.NET友好视图,这些视图主要模拟我们的业务对象?

    关于打字方案的问题 - 请记住这些类型非常静态:

    • 我们应该将[EntityType]和[EntityTypeType]表,它们的分类以及它们汇总到C#类中吗?这将类似于枚举脚手架,只需要一个名称/ int,因为它们有有效载荷的日期范围和类型有效载荷。如果是这样,有关如何搭建这些文件的一些想法 - 作为静态类?硬编码的对象列表?
    • 我们是否应该在启动时缓存打字方案(这让我感到困扰,因为它增加了启动控制台应用程序的大量开销)?
    • 任何其他想法 - 脚手架XML文件?等...

    非常感谢任何想法或经验!

2 个答案:

答案 0 :(得分:2)

我尝试回答每个问题,但我不得不承认我不确定您是否在运行时尝试在数据库之上动态创建实体 - 或者您是否只是尝试动态创建实体运行时间。

如果您尝试发布在SQL Server中的架构发生更改时动态更改/调整的代码,那么我会有一些不同的答案。 =)

这只是.NET中一个不可行的数据模型吗?

你提到的一些事情让我很突出:

  1. 很多M x M关系。
  2. 实体/的EntityType / EntityTypeType
  3. 汇总
  4. 阅读后我有些问题:

    1. 您是否选择了建模数据的框架,希望它能让一切变得更轻松?
    2. 您选择了一个框架,因为它似乎是“正确”的方式吗?
    3. 我很难跟踪你如何建模数据。什么是EntityTypeType?
    4. 是否真的需要所有M x M关系?仅仅因为实体A和实体B可以处于M×M关系中,它们应该是吗?
    5. 我不知道您的域名,但我知道我很难按照您的描述进行操作。 =)在我看来,由于两个原因,它已经变得有些不可行了:1)你问的是关于它的问题,b)没有大量的文字就不容易描述。

      我们是否应该首先将我们的数据库展平为更多.NET友好视图,这些视图基本上模拟我们的业务对象?

      是的!

      至少从我的经验来看,我会说是的。 =)

      我认为在数据库中创建具有复杂关系的实体是可以的。父母/子女,点对点,等级等等。一切都很好,正常。

      但应用程序不应该解释所有这些来理解它。数据库擅长连接,分组数据,创建视图等。我建议创建尽可能接近业务对象的视图或存储过程 - 至少对于读取来说。

      还要考虑如果将相关对象的复杂性推向应用程序,则可能会产生一些性能损失。

      我们应该将[EntityType]和[EntityTypeType]表,它们的分类以及它们汇总到C#类中吗?

      我会反对这一点。唯一的原因是现在您正在应用程序层中进行数据库工作。如果你想做连接/汇总/等。你在应用程序中管理这些数据 - 而不是数据库。

      我确定您已经知道这一点,但是您希望避免将数据库中的所有内容都恢复到应用程序中,然后然后运行查询/构建对象。

      SQL Server在关联对象和将不同实体拉在一起时非常棒。在那一层它会非常快。

      我会创建业务对象并从SQL填充它们。

      如果您需要构建EntityType / EntityTypeType,请注意不要遇到N + 1问题。

      关于如何构建这些文件的一些想法 - 作为静态类?硬编码对象列表?

      选项:

      1. 使用ORM为您生成课程。你已经在EF中看到了一些。
      2. 通过查看实体的SQL Server架构编写自己的代码生成工具。
      3. 手动编写未生成的类。我看到这一直在做,并没有你想象的那么糟糕。绝对是一些笨拙的工作,但也提供了灵活性。
      4. 我们是否应该在启动时缓存打字方案(这让我感到烦恼,因为它增加了启动控制台应用程序的大量开销)?

        您想在应用程序加载时根据您的实体生成业务对象吗?或者另一种表达问题的方法......在运行时生成代理类?

答案 1 :(得分:1)

我不熟悉Len Silverston的书,我认为StackOverflow用户绝大多数都不是。由于你在3天内没有得到你的问题的答案,我现在无论如何都会对它发表评论。

在数据库模型中,奇怪的是你似乎有多个嵌套的N:M关系。很少有真正的N:M关系 - 大多数情况下,N:M关系模型中的中间表实际上代表了现实生活中存在的一个对象,留下了两个常规的1:N关系,而不仅仅是两个列链接表。在过去的25年里,我只遇到过一两个真正的N:M关系,所以我有点怀疑你实际上有三个 - 这似乎更有可能是你使用的模式不适用于你认为它的方式。

你所描述的有点像你试图在数据库中建模数据库。特别是“我们应该首先将我们的数据库压缩成更多.NET友好视图,这些视图基本上模拟我们的业务对象吗?听起来很腥。除了极少数例外,您的数据库表应该与您的业务对象匹配。如果您需要创建展平视图以查看实际对象,则可能完全朝向错误的方向。但话又说回来,很难从你提供的信息中分辨出来。

请简要介绍一下您正在尝试做什么,到目前为止您做了什么。