3

问题是关于 SQL Server 2012 上的 SQL。

背景:

有一个名为Entity的实体。

实体可以有N EntityVersion ( 1:n )。

EntityVersion可能被批准或不被批准。如果被批准ApprovedBy,将在整个版本中分配一个属性。

要求:

要求列出所有实体的最新实体版本,但仅列出每个实体的最新批准版本。

问题:

我需要找到一种最佳方式来实现大规模解决方案的整个查询。

出于这个原因,我想到了两种可能的方法:

  1. EntityVersion 上的IsLast标志列。每当添加新版本时,整个事务将设置true为新添加的版本,并且之前的最后一个版本将被分配false.

  2. 将处理每个新实体版本插入并将新版本添加到仅具有最新版本的特殊表的触发器。每当添加新版本时,都会从整个特殊表中删除以前的版本。也就是说,SELECT获得整个上市将非常便宜。

问题:

什么是最佳和有效的方法?您还有其他方法吗?

谢谢!

请注意,“最佳”意味着它将是可扩展的,并且可以处理数百万条记录



更新

由于我发现一些用户在他们的答案中要求Entityand的架构如何EntityVersion,所以我将更好地描述它们。

  • 实体没有文本信息:只是一个标识符和与其他实体的关系。

  • EntityVersion具有文本和其他信息。例如:标题、描述、作者...重要的是要提到EntityVersion没有来自Entity.

最简单的解决方案是拥有类似 a 的东西SELECT DISTINCT,它既可以定义不同的列,又可以在同一查询中选择其他列。可悲的是,据我所知,这在 SQL Server 中是不可能的(我错了吗?)。

4

1 回答 1

1

我认为 IsLast 标志列就足够了,但是....

  1. 您应该回答的第一个问题是:实体与 EntityVersions 的比率是多少?这会影响你的决定。
  2. 另外,我不确定您的表结构,但我会假设 EntityVersion 表是存储更改字段的 Entity 表的副本(或者可能只是差异?)。如果是这种情况,为什么不将最新版本存储在 Entity 本身中。我认为这是一种在语义上更正确的方法。
  3. 通常,如果您有正确的索引(也许尝试合并columnstoreIndexes?),您不必执行任何特殊工作,例如可能很昂贵的触发器。尝试使用 GroupBy 的常规 Join 进行测试(或者,如果您的 EntityVersion 表具有所有必要的字段,您甚至不需要加入)。或者这种方法可能会更快一点: https ://stackoverflow.com/a/438990/1792936
  4. 同样,您只能根据执行计划和速度测试构建最佳查询。

  5. 如果一切都失败了,也许尝试合并CQRS 模式或类似的东西

于 2013-03-10T21:16:19.997 回答