我的情况
我有 MySQL 数据库,每个数据库都有相同的模式(表结构和关系完全相同)。
Green 数据库中的数据由其他三个共享。我有一个夜间进程,可以在 Green 数据库中查找更改并将它们 UPSERT 到其他三个数据库中。
将绿色数据库视为由一个单独的团队更新的参考数据,但它有很多,而且每天都在变化。
最终结果是,蓝色、红色和紫色数据库中的每一个都是其独有的可更新记录和绿色数据库中可能被引用但不能修改的记录的混合。
问题
自定义同步过程混乱且不可靠,对问题并不重要。
我的问题
有没有更好的方法将共享(绿色)数据与其他数据库结合起来?我希望对应用程序数据访问层的影响最小,该访问层专为通过夜间同步过程实现的交错数据而设计。
考虑的想法
我考虑将绿色数据保留在自己的模式中(在同一个 MySQL 服务器上)并为我的其他数据库中的每个表创建一个视图(用于查询),以产生原始合并表的错觉:
CREATE VIEW blue.vw_table001 AS
SELECT * FROM blue.table001 UNION
SELECT * FROM blue.table001;
这将允许我简单地将我的 Hibername 映射到原始表的映射替换为到相应视图的映射。然后写入将像今天一样引用实际的表。
但是,这会产生两个问题......
- 我必须消除所有外键,因为 Blue 数据库中的记录可以引用 Green 数据库中的记录。
- 我被告知以这种方式组合数据的性能不会很好。重要的是要知道有一些复杂的查询会跨多个表连接,而这些表现在将跨视图连接。
最后的想法
虽然最好不要将绿色数据复制到其他三个中(并且有一天可能会超过三个),但只要机制相对简单可靠(我的 java 解决方案非常复杂),我就可以接受并且容易出错)。
此外,您可能想知道在 Green 数据库中创建的记录与其他三个记录之间的主键冲突。我们几乎同步的逻辑将绿色记录的原始 ID 记录在一个特殊的列中,然后为记录分配一个本地唯一的 ID。