我不了解SOA(面向服务的体系 struct )和数据库.虽然我被SOA概念(将可重用的业务逻辑封装到服务中)所吸引,但我不知道如果封装在服务中的数据表被其他服务/系统需要,它应该如何工作-或者在这个场景中SOA适合at all吗?

更具体地说,假设我有两项服务:

  • CustomerService:包含my Customers数据库表和相关的业务逻辑.
  • OrderService:包含我的Orders表和逻辑.

现在,如果我需要用一条SQL语句来处理CustomersOrders个表,该怎么办呢?如果表包含数百万个条目,如果我必须使用SOAP/XML通过网络发送数据,则会导致不可接受的性能.那么如何进行JOIN米呢?

我做了一些调查,发现了一些建议的解决方案:

  • Use replication在需要的地方制作所需数据的本地副本.但是没有封装,那么使用SOA有什么意义呢?on StackOverflow讨论了这个问题,但是没有明确的共识.
  • 设置一个封装所有数据库数据的Master Data Service.我猜它会变得非常庞大(每个存储过程基本上只有一个API调用),并且需要随时更新.在我看来,这似乎与enterprise data bus概念有关.

如果您对此有任何意见,请让我知道.

推荐答案

在此上下文中,"服务"的定义原则之一是,它绝对拥有它负责的区域中的数据以及对该数据的操作.

通过复制或任何其他机制复制数据,可以免除这一责任.要么也复制业务规则,要么最终会出现需要更新其他服务来更改内部规则的情况.

使用单一数据服务只是"不做SOA";如果只有一个地方管理所有数据,那么就没有独立的服务,只有一个服务.

相反,我建议使用第三种方法:使用组合将数据放在一起,完全避免数据库级的连接操作.

与其考虑需要在数据库中将这两个值连接在一起,不如考虑如何在边缘将它们组合在一起:

为客户呈现HTML页面时,可以从多个服务中提供HTML,并直观地将它们组合在一起:客户详细信息来自客户服务,订单详细信息来自订单服务.

同样,发票邮箱:可视化地合成来自多个服务的数据,而不需要数据库中的连接.

这有两个优点:第一,不需要加入数据库,甚至不需要将数据存储在同一类型的数据库中.现在,每个服务都可以使用最适合其需要的任何数据存储.

第二,您可以更轻松地更改应用程序的外部.如果您有小的、可组合的部分,您可以很容易地添加,并以新的方式重新排列这些部分.

Database相关问答推荐

您是否遇到过 SQL Server 因为引用了太多表而无法执行的查询?

时间数据库设计,有一个转折(live vs draft rows)

如何将 PHP 会话数据保存到数据库而不是文件系统中?

repeating groups是什么意思?

su postgres:Sorry?

设计用于存储多人游戏的各种要求和统计数据的表格

关系数据库如何在幕后工作?

主键、唯一键和外键约束以及索引之间有什么区别?

审计表:一个表或一个表的每个字段

我什么时候应该考虑使用内存数据库,需要注意什么问题?

在内存中创建 SQLite 数据库

Redis-cli - Select 哪个实例?

有什么理由不应该在生产中使用 h2 数据库?

CouchDB、MongoDB 和 Redis 中的哪个数据库适合从 Node.js 开始?

显式事务回滚是否必要?

我应该混淆用户的数据库 ID 吗?

如何在数据库中获取原始的created_at值(不是转换为 ActiveSupport::TimeWithZone 的对象)

如何在 SQLServer 数据库的两个实例之间复制数据记录

用于 sql 表中的状态列的类型

带数据库的Electron 应用程序