【问题标题】:Entity with versioning: optimal way of getting a list of last version using SQL具有版本控制的实体:使用 SQL 获取最新版本列表的最佳方式
【发布时间】:2013-03-10 19:48:03
【问题描述】:

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

背景:

有一个实体叫Entity

Entity 可以有 N EntityVersion (1:n)。

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

要求:

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

问题:

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

因此,我想到了两种可能的方法:

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

  2. 一个触发器,它将处理每个新的实体版本插入,并将新版本添加到一个只有最新版本的特殊表中。每当添加新版本时,都会从整个特殊表中删除以前的版本。也就是SELECT获取整个listing会很便宜。

问题:

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

谢谢!

请注意,“最佳”意味着可扩展且可处理数百万条记录



更新

由于我发现一些用户在他们的答案中询问EntityEntityVersion的架构如何,我将更好地描述它们。

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

  • EntityVersion 包含文本和其他信息。例如:标题、描述、作者... 需要指出的是,EntityVersion 没有来自 Entity 的任何重复信息。

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

【问题讨论】:

    标签: .net sql sql-server tsql relational-database


    【解决方案1】:

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

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

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

    【讨论】:

    • 请检查我的问题底部的更新,以便更好地了解 EntityEntityVersion 是什么。关于你的观点:1)它可能很棒。想想 Wikipedia 或 StackOverflow 本身(1 个问题可以有数百个版本)。关于其他点,我去看看,期待一天的反馈!感谢您的积分。
    • 另外,我相信第二种方法可能类似于 CQRS 模式。我错了吗?
    • 我已经阅读了列存储索引。这是一个非常有趣的阅读,它是一个非常强大的工具。 CQRS 模式 + 列存储索引可能是一个非常强大的方法!
    • 最后,我将使用方法 2):Entity 现在与 EntityVersion 有一个 1:n 关系,称为 LastApprovedVersionId。这样,在面向对象模型中,每当某个实体的版本被批准时,我都会设置整个 LastApprovedVersion 关联。就是这样!感谢您的建议,正如我在之前的评论中所说,即使我这次不打算使用列存储,也是一个很好的发现!
    • @MatíasFidemraizer,我希望这对你有用。不要忘记,如果您在查询和数据库优化之后仍然对性能不满意,也许硬件升级可以帮助您。 SSD 可以产生重大影响。
    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2012-12-04
    • 2015-08-12
    • 2023-03-24
    相关资源
    最近更新 更多