数据库功能分解的模式?

Posted

技术标签:

【中文标题】数据库功能分解的模式?【英文标题】:Patterns for database functional decomposition? 【发布时间】:2012-10-31 19:49:33 【问题描述】:

我们有以下问题。我们的企业应用程序在 mysql 中有一个数据库,它的结构似乎变得太复杂了——那里有 100 多个表(它已经开发了 7 年)。

但是,大多数表与任何其他表根本没有任何关系。有一些所有人都使用的通用表(字典)(大约二十个这样的表),但仅此而已。问题是如何使这个数据库更快、更可靠。

我阅读了很多关于数据库分解的文章。也就是说,您将与不同域相关的表放在不同的数据库中。例如,与运单和其他纸质资料相关的任何内容都放在名为 Papers 的数据库中,与客户及其订单相关的任何内容都放在名为 Clients 的数据库中等等。

这里有两个问题:

用户应该将企业应用程序视为在单个域上运行。开发人员必须以某种方式更改使用数据库的核心,以便它可以处理多个数据库。 公用表出现问题。它们必须保存在单个数据库中,并且分解后不能在所有数据库中复制。因此,我们如何查询 SELECT * FROM A JOIN B,A 和 B 在不同的数据库中(在不同的服务器上)?

这两个问题实际上解决了同一个问题 - 是否有任何常见的企业模式(如 GoF)来解决这个问题?我对适合 Java EE 的模式特别感兴趣。

【问题讨论】:

【参考方案1】:

我不一定会首先将表组移动到它们自己的数据库中 - 这会使系统更加复杂,而且现在您还有其他问题,例如同步多个数据库的备份。 IMO 100 表一点也不笨重。

但是,如果业务驱动需要将系统(和数据库)的功能拆分为多个系统,那么一定要这样做。显然,这需要同时对系统进行重大更改甚至重写。

Re : 运单、发票等不幸的是,MySQL 没有像 MS SQL Server 等其他 RDMS 那样实现Schema。 您可以通过向表(PaperWaybill、PaperInvoice 等)添加前缀来模拟模式固有的命名空间。

但是,鉴于您的系统已经投入生产 7 年,现在更改表名可能是不明智的,并且确定所有依赖项可能会很棘手 - 例如可能有多个应用程序、报告、作业等都在访问这些表。

IMO,您需要深入了解关系如此之少的核心原因。 可能存在关系,但是,FOREIGN KEYS 已被删除,例如为performance reasons。如果这妨碍了您绘制系统图的能力,或者阻止诸如 ORM 代码生成器之类的工具创建关系,您可以将 PROD 数据库恢复到 DEV 环境并将外键添加回 DEV。同时,您会对数据的质量有所了解 - 例如。 FK 约束。

【讨论】:

以上是关于数据库功能分解的模式?的主要内容,如果未能解决你的问题,请参考以下文章

微服务常见问题及解决方案

如何将关系模式分解到BCNF(3NF)

数据关系模式设计的标准化

数据库系统方面的问题,求最小函数依赖集、候选码、分解满足范式的关系模式

设计用于分解需求预测的简单模式

er图的联系转化为关系模式时,怎样进行3NF分解?