数据库功能分解的模式?
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 约束。
【讨论】:
以上是关于数据库功能分解的模式?的主要内容,如果未能解决你的问题,请参考以下文章