RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 848248
Accepted
Eladei
Eladei
Asked:2020-06-29 18:33:00 +0000 UTC2020-06-29 18:33:00 +0000 UTC 2020-06-29 18:33:00 +0000 UTC

统计信息的收集(DDD 与事务脚本)

  • 772

有一个服务器列表。每个服务器都有自己的玩家列表。玩家名单以及服务器数据会定期更改。为每个玩家保留单独的统计数据。

为了收集有关服务器和玩家的信息,我创建了一个单独的上下文。决定申请CQRS。

为了显示统计信息,我创建了一个单独的读取模型。这里的一切都很简单——通常的读取操作。

有一个关于信息记录领域的问题。

接收统计数据处理时最好应用什么:

  1. 使用一组聚合、事件和其他战术模板形成一个成熟的领域模型

  2. 使用普通交易脚本(Transaction Script)

我倾向于使用事务脚本:

  • 易于实施
  • 海量数据一次性更新

在这种情况下使用DDD让我感到困惑:

  • 我无法想象在处理统计信息时使用 DDD 方法——可能有大量抽象
  • 存储库涉及一次编辑一个聚合。假设我的服务器播放器是具有相应统计信息的单独聚合。如果需要更新大量玩家的信息,数据库的负载会很大。

另一方面:

  • DDD 将允许您正确封装数据验证逻辑。

  • 随着时间的推移,事务脚本很难维护。

我真的需要你的建议)

model
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Mark Shevchenko
    2020-07-07T22:50:38Z2020-07-07T22:50:38Z

    当您拥有丰富的主题领域时,DDD 方法非常适合:文档的移动、法规、同一业务场景中不同实体的交互。数据处理任务,尤其是较快的数据处理,不太适合 DDD,因为其中的逻辑比较简单,SQL 足以解决。

    也就是说,DDD 过于复杂,无法解决如此简单的问题。此外,DDD 可能不是一种非常高效的方法,因为例如它涉及加载整个聚合。

    这是一方面。另一方面,DDD 方法不是一套硬性规定,而是一套原则。我们可以为数据处理分配一个有界上下文,其中模型将比主上下文中的模型更简单。

    存储库一次只能处理一个聚合的规则实际上并不存在。存储库 是一个超大的集合,因此我们不能直接使用它的所有元素,只能使用一些小片段。这就是 Evans 定义存储库的方式。

    如果主题领域规定,存储库可能包含用于批量插入、删除和修改数据的方法。相反,您需要注意这样一个事实,即每次这样的调用都执行得很快,也就是说,您不能创建一个方法来更新数据库中的所有记录,可能是几百万。相反,我们需要一种批量(页面)更新的方法,而每批的大小可以是 100 或 1000 条记录。

    用于解决统计问题的实体没有行为,因此在我们有限的上下文中,我们使用贫血域模型模式。必须记住,它通常被认为是一种反模式,这是相当公平的。但在这种特殊情况下,这是正确的决定,因为事实上,我们必须在数据库中对数据进行切片,并借助关系代数的一些操作将其缩减为几张表。

    第二种方法我不仅仅定义为事务脚本。最终,我们可以使用专门的工具来准备报告,该工具将具有对数据库的读取权限,即某种 Microsoft Reporting Services。我们可能必须在相邻数据库中聚合中间数据,以便以后更快地生成报告,我们将在 SQL 中执行此操作。

    一般来说,我们没有义务在 DDD 和 OOP 的框架内做出所有决定。他们甚至不需要使用 Java/C#/Python 项目的主要语言来完成。在这里,团队的技能起着决定性的作用。

    我要对这样一个系统添加的唯一限制是统计应用程序不得更改主数据库中的数据。它具有只读访问权限,如果它需要自己的中间数据,它会将它们存储在单独的模式或单独的数据库中。此限制将使您避免出现细微的错误。

    全部的:

    1. 如果您的整个团队主要使用 Java/C#/替代您的语言编写,那么请尝试使用贫乏模型和强大存储库的有限上下文。

    2. 如果有人在 SQL / Reporting Services 等方面摸不着头脑,您可以单独制定解决方案。它可能比在 Java/C# 中做同样的事情更快、更方便。

    3. 中间解决方案:您可以使用 Java/C# 制作专用解决方案,但需要最少的 OOP。您可以使用简单的数据访问模式:行网关、表网关、事务脚本等。

    4. 无论您选择哪个选项,都不要从第二个解决方案写入主库,以避免难以查找和修复的错误。只读访问主数据库,只有主上下文可以改变它。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5