将一个软件分成多个模块,每个模块都有自己的数据库更好吗?

Posted

技术标签:

【中文标题】将一个软件分成多个模块,每个模块都有自己的数据库更好吗?【英文标题】:Is it better to divide a software into multiple modules with each module having its own database 【发布时间】:2013-03-02 18:04:42 【问题描述】:

我正在开发一个主要在 asp.net 中以 Oracle 11g 作为后端开发的医疗保健应用程序。在当前状态下,应用程序分为 3 层,即 UI、BLL 和 DAL。由于 BLL 和 DAL 是类库项目,它们被部署为单个 dll(一个 dll 用于 BLL,另一个用于 DAL)。最近,另一位开发人员对该软件进行了审查,他提出将整个软件划分为单独的模块的建议,每个模块都有自己的项目和数据库,即库存模块作为 InventoryUI(asp.net Web 应用程序项目、InventoryBLL(类库项目)和 InventoryDAL(类库项目)。所有模块都获得三个不同的项目,它们具有单独的数据库,通过 Web 服务相互通信。

所以我的问题是

    这个建议的架构是否比我们现有的更好? 为 BLL 和 DAL 提供多个 dll 是否更好。有什么优点和缺点。 为单个应用程序拥有多个数据库是否更好?怎么样?

欢迎提供任何链接和建议。

【问题讨论】:

【参考方案1】:

物理上分离模块的优点是它允许在不同团队之间进行逻辑分解。在您的情况下,您可以有一个库存团队负责所有与库存相关的事情,他们发布一个 API,对于所有其他团队,库存模块的基础是一个黑匣子。这是解决您的领域复杂性的一个优势。

缺点是,如果您的项目很小,您可能会在软件开发和部署过程中引入更多复杂性,尤其是当您执行诸如跨越流程(或机器)障碍之类的事情时。

    建议的架构可能会根据项目的需要更好,尤其是在大小方面。一些妥协也可能是更好的方法 - 如果您发现您可能有几十个或一百个模块,将相似的模块组合在一起是一种实用的方法。

    多个 DLL 用于业务逻辑和数据访问是可以的,只要有一个共同的祖先提供基类以供使用。每个 DAL 在连接字符串方面都有自己的配置是一个非常糟糕的地方。同样,如果一个 DAL 使用映射器模式,另一个使用活动记录 - 虽然两种模式可以共存 - 这些模式应该在基类中提供。

    假设您的 RDBMS 支持多个模式,我将首先使用多个模式,然后再访问多个数据库。当数据库的性质发生变化时,我会访问多个数据库 - 高事务量与高读取量(分析)。如果您有需要跨模块的事务,并且您在物理上分离了管理这些事务的数据库,则可能会变得不必要地复杂。

【讨论】:

感谢您的详细回答,抱歉回复晚了。这清除了大部分事情。【参考方案2】:

这完全取决于您的业务需求。

听起来评论者是在指向 SOA 的方向。分离成独立的物理模块可以提供一定的安全性,因为系统的某些部分可能会发生故障而不会导致一切崩溃。

但是,分离应用程序也给产品带来了复杂性(特别是在为了提交单个业务事务,您必须与多个模块进行通信的情况下)。

【讨论】:

+1 关于管理交易。如果将来他将每个项目移到单独的盒子中,这也可能成为一个问题。【参考方案3】:

我曾参与过一个项目,该项目(根据客户要求)通过包含另一个应用程序继承了第二个数据库,我不提倡这种方法。它使代码库变得混乱,您通常最终需要在数据库之间复制数据,或者需要您的业务逻辑访问两个数据库(直接或通过一些其他机制,例如 Web 服务调用)。在有问题的情况下,这是必要的,因为一个数据库是 Oracle,另一个是 SQL Server,因此合并这两个数据存储区会非常令人头疼,但这不是我会轻易选择的路线。

建议将项目拆分为具有不同数据库的多个项目的审稿人提出了哪些论据?即使您想将业务逻辑按功能区域拆分为单独的 DLL,为什么需要不同的数据库和 DAL?这似乎是为了复杂性而引入复杂性,除非您的代码库确实庞大,或者存储的数据量导致单个数据库中的性能问题,可以通过将数据拆分为单独的数据库来缓解这些问题。考虑到这一变化可能涉及的工作量,这个人似乎有责任证明你为什么应该这样做!

【讨论】:

【参考方案4】:

我倾向于首先定义子域,并确保它们根据功能在逻辑上进行划分;不要太大,不要太小。然后,每个子域将成为一个独立的软件,由服务层、应用程序层、域层和基础设施层组成(正如我所描述的 here)。

这也意味着它们每个都有自己的存储库,但不一定是单独的数据库。事实上,我主要想保留一个数据库,但使用不同的模式来识别表所属的域。这样可以保持表之间的约束(跨模式)并保证数据的一致性。

所以我认为在逻辑模块中构建代码是有意义的(实际上你应该这样做),但如果不是真的需要,我会对数据库执行此操作,因为它会在维护和可靠性方面让您的生活更加困难。

【讨论】:

【参考方案5】:

这一切都取决于您的要求。

如果您将来需要移动到单独的物理层,这可以派上用场 (您可以在不同的机器上运行每个项目,从而将每个项目分开 模块)。但是,这将导致整体应用程序的减少 表现。这样做的好处是其他项目可以独立访问这些单独的项目/层。

我非常怀疑您是否会通过分离数据库获得任何收益。您是否打算将来将每个数据库移动到不同的盒子中?如果不是,那么我会说坚持使用具有不同架构的单个数据库。

【讨论】:

以上是关于将一个软件分成多个模块,每个模块都有自己的数据库更好吗?的主要内容,如果未能解决你的问题,请参考以下文章

Flyway 一个模式中的多个元数据表

vuex2

为啥将我的模块分成多个文件会使其变慢?

分享

分布式事务几种方式

模块化