Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在有界上下文中使用多个数据库

在有界上下文中使用多个数据库
EN

Software Engineering用户
提问于 2023-05-30 01:18:46
回答 2查看 89关注 0票数 0

有时,我们必须在一个项目中使用多个数据库,目的是:

  1. 去角色化数据或读取模型
  2. 利用数据库的优点(技术)

有很多关于第一宗案件的讨论,但我没有发现关于第二宗案件的任何消息

示例1:为了解决基于组织图的组织访问的复杂性,我们使用了图形数据库(如neo4j )。

示例2:我们希望使某些系统表单(实体)具有动态,并允许用户向其添加新字段并将这些附加值存储在nosql中。

考虑到大多数用例在事务上更好,我们使用工作单元,但是这种模式与几个数据库不兼容。

我想到的主要解决方案是使用SQL数据库作为主数据库,而其他数据库将数据存储为阴影(或数据的投影),并始终与主SQL数据库同步(与发件模式和事件同步)。

我再次强调,这个影子数据不是用来读取模型的,它对程序的写端(业务逻辑)有影响。

谢谢

更新:完整示例

假设我们有一个系统,它使用发件箱模式来确保事件被发送,并且在工作单元结束时,它们被提交。

组织结构图数据应该在neo4j内部。

也就是说,执行了AddChartUseCase,它必须将数据保存在neo4j中,事件必须保存在发件箱(ChartCreatedEvent)中。

如何有一个工作单元来管理两个数据库之间的事务(我认为答案是:不可能)

EN

回答 2

Software Engineering用户

发布于 2023-05-30 07:11:01

“工作单位”不一定与多个数据库不兼容。它与不同的服务/进程不兼容,其中每个服务都有自己的存储系统。

在一个服务中,一个UoW理论上可以容纳两个或多个不同的数据库上下文,在两个服务上执行一个组合事务,并在另一个数据库的提交操作失败时管理对另一个数据库的手动回滚。然而,这意味着您将同时使用两个数据库并同步使用一个服务,这可以很容易地引入缩放问题。

由于您提到了事务发件箱模式,我认为您所想到的体系结构看起来是不同的:每个数据库都由不同的(微?)控制。服务,这意味着您需要分布式事务。“发件箱”是实现此功能的一种常见方式,它将业务事务分成两个或多个技术事务,每个服务至少有一个。

这样,您就可以使用UoW来

  • 收集用于其数据库的一个服务内部的CRUD操作,以及更新依赖服务所需的命令
  • 当涉及提交时,应用CRUD操作以及插入到发件箱表中,并将前面提到的命令作为有效负载。

然后,依赖服务将从发件箱中获得由消息中继和消息代理生成的事件,并必须相应地解释有效负载。也许为了解释事件,他们必须自己创建一个UoW,这将取决于总体的复杂性。在最坏的情况下,这里的失败事务需要生成一个事件来再次回滚第一个事务(但这与情况有关,当您的不同数据库在这种程度上相互交织时,您可能会重新考虑将数据拆分到不同DBMS中的选择)。

TLDR;UoW是一个服务的实现细节,当您的数据库处于不同服务的控制之下,并且您的业务事务跨越多个服务时,一个UoW就不足以实现一个业务事务。

票数 2
EN

Software Engineering用户

发布于 2023-05-31 02:01:26

除了@DocBrown的答案。

请允许我再“快一点”一点。

如何有一个工作单元来管理两个数据库之间的事务(我认为答案是:不可能)

如果您询问如何将两个数据源的事务链接到一个单独的按酸方向的事务,则答案是分布式事务。坏消息是,实施起来并不容易。至少还不够简单,无法从UoW中完成。

分布式事务也很难实现,因为并非所有数据源都支持这些事务。如果没有,则需要一个自定义实现。自定义实现有两种形式:中间件(例如应用服务器)或自定义事务管理器(例如库)。在这两种情况下,UoW都会请求与这个新的“层”建立新的连接,并将其操作为一个常规DB事务。在幕后,事务管理器/中间件完成所有困难的工作。

如果要实现自定义事务管理器,考虑到事务的短暂性,两阶段提交算法看起来是一个很好的起点。

现在请记住以下几点:不能假设所有数据源都实现ACID事务。希望您的数据库能够打开连接、创建事务、保存(提交)数据或对称地还原更改(rollback),但是如果其中一个数据库不支持回滚或ACID事务,则必须向事务管理器提供自定义故障转移策略。例如,当不支持回滚时,事务管理器必须执行补偿事务。这些事务也需要事务管理..。正如您可能猜到的,编码不是一件琐碎的事情。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/445786

复制
相关文章
C++中符号优先级问题
转载自:https://blog.csdn.net/lfb_2048/article/details/62040608
种花家的奋斗兔
2020/11/13
6190
mold源码阅读五 符号相关
上期讲完了resolve_section_pieces,在这之后本应是combine_object,但是combine_object几乎包含了后面的所有过程,因此等到整个流程讲完后或许会再回来讲,这一期的内容以符号版本的处理为主。
AkemiHomura
2023/05/03
3200
mold源码阅读 其三 符号决议
前面两期将读取输入的部分全部讲完了,本期开始涉及链接过程中的处理。在讲主要的符号决议之前,先讲一下mold在符号决议执行之前做的一些其他处理。
AkemiHomura
2023/04/12
3760
【陆勤阅读】探索机器学习中的数据科学
原文作者:原微软技术与研究部门合伙人数据科学架构师Mario Garzia 译者:杜红光 数据科学与“大数据”已经成为21世纪高科技产业的流行语。而“大数据”这个术语,在很多情况下是相对于我们收集、存储和处理数据的能力来说的。有关大数据的挑战并非新生事物,历史上也曾出现过一些著名的大数据使用案例。一个有趣的例子是美国人口普查, 1880年进行的美国人口普查,耗时8年才完成了全部的数据汇总。同时,由于人口膨胀的原因,当时人们预计完成1890年的人口普查要10年以上的时间。这就是当时的一个大数据问题。随后一
陆勤_数据人网
2018/02/26
5960
【陆勤阅读】探索机器学习中的数据科学
【陆勤阅读】数据科学
“用数据来研究科学,科学的研究数据” “数据科学将逐渐达到与其他自然科学分庭抗礼的地位” ——作者 数据科学主要包括两个方面:用数据的方法来研究科学和用科学的方法来研究数据。前者包括像生物信息学、天体信息学、数字地球等领域。后者包括统计学、机器学习、数据挖掘、数据库等领域。这些学科都是数据科学的重要组成部分。但只有把它们有机地放在一起,才能形成整个科学的全貌。 在数据科学领域里工作的人才需要具备两方面的素质:一是概念性的,主要是对模型的理解和运用;二是实践性的,主要是处理实际数据的能力。培养这样的人
陆勤_数据人网
2018/02/26
7580
【陆勤阅读】数据科学
C++ 中有符号类型到无符号类型的转换
为了更好地解释下面的代码,先来介绍一些背景知识,在我的计算机中, char 类型占 8 个比特位,那么, unsigned char 类型能表示的数的范围为 0 ~ 2的8次方 - 1,即 0 ~ 255,共 256 个数;int 类型占 32 个比特位,那么 unsigned 类型所能表示的数的范围为 0 ~ 2的32次方 - 1,即 0 ~ 4294967295,共 4294967296 个数,接下来看下面的代码:
用户7886150
2021/02/15
1.4K0
Docker为何未在生产环境中取得广泛成功?
Docker的发展势头一天比一天强劲,它显然在试图解决实际的问题。然而,对如今许多的生产环境用户来说,没有出现优点压倒缺点的局面。在开发、测试和持续性集成等环境下,Docker在让容器吸引广大开发人员方面确实有上佳的表现,不过它还没有颠覆生产环境。按照DockerCon 2015的“生产环境下的Docker”这一主题,我想公开讨论Docker想在生产环境使用场合下得到广泛采用还没有克服的种种挑战。这里提到的问题没有一个是新问题,它们都以某种形式出现在GitHub上。大多数问题我已经在大会演讲中或与Docke
静一
2018/03/23
1.4K0
mold源码阅读九 未解析符号的处理
本期内容主要是claim_unresolved_symbols的部分,其次是其他一些简单的处理
AkemiHomura
2023/10/22
2150
C++解析一些特殊符号tab、换行符号
我们经常会遇到一些Linux内核信息需要,比如一个wifi数据,中间是用tab键盘隔开的,然后每一行用换行符进行区分,如下所示的数据
良知犹存
2021/05/12
9920
C++解析一些特殊符号tab、换行符号
C++鲜为人知的符号
这些鲜为人知的C++符号,可直接在代码中使用,但实践中不推荐这么做,可作为茶余饭后的乐趣了解C++的另一面。
一见
2018/08/10
3070
c++ 常量表达式_c++符号常量
常量表达式主要是允许一些计算发生在编译时,即发生在代码编译阶段而不是代码运行阶段。这是很大的优化,因为如果有些事情可以在编译时做,那么它只会做一次,而不是每次程序运行时都计算。 使用constexpr,你可以创建一个编译时的函数:
全栈程序员站长
2022/11/10
3080
Python中的符号
1.算数运算符 2.复合赋值运算符 3.常用的格式符号
py3study
2020/01/10
2.7K0
FPGA设计中 有符号数、无符号数
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
FPGA技术江湖
2020/12/29
1.7K0
FPGA设计中 有符号数、无符号数
LaTeX求和符号_matlab中求和符号怎么表示
Latex的求和公式: 若想输出 ∑ i = 0 n \sum_{i=0}^n i=0∑n​ 则需要输入:
全栈程序员站长
2022/11/18
2.3K0
jQuery中$符号的实质
其实就是一个函数,以后用的时候,记得跟小括号 参数不同,功能就不同。3种用法: 参数是一个function, 入口函数 $(function () { }); $(domobj) 把dom对象转换成jquery对象 $(document).ready(function () { }); 参数是一个字符串,用来找对象 $("div") $("div ul") $(".current") 案例:检测$符号类型 <!DOCTYPE html> <html lang="zh-CN"> <h
兮动人
2021/06/11
3.7K0
jQuery中$符号的实质
Excel中$符号的妙用
Excel 使用过程中,不知道你有没有用到过 $ ,如果从来都没有用到过,可能代表你的修为还不够深,来看看为什么这么说。
披头
2019/12/26
2K0
Linux中符号的用法
用;号隔开每个命令, 每个命令按照从左到右的顺序,顺序执行, 彼此之间不关心是否失败, 所有命令都会执行。
头皮阴都都
2020/04/23
3.4K0
C++之Error无法解析的外部符号[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153486.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/13
3K0
如何看懂常用原理图符号、如何阅读原理图
原理图是我们设计,构建和排除电路故障的地图。了解如何阅读和遵循原理图是任何电子工程师的重要技能。
不脱发的程序猿
2021/01/20
4K0
latex中求和符号正下方的符号怎么打_累加符号上下标的意义
放在左上角的时候 \sum^n: ∑ n \sum^n ∑n 放在正上方的时候 \sum\limits^n: ∑ n \sum\limits^n ∑n​
全栈程序员站长
2022/11/07
4.4K0

相似问题

什么是KEYVAL?它的目的是什么?

12

什么是JAF?它的目的是什么?

30

这个for循环是如何工作的?它的目的是什么?

40

什么是xcscheme文件?它的目的是什么?

10

什么是双关语,它的目的是什么?

34
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文