外键在不同的数据库连接中

时间:2018-01-25 13:10:45

标签: mysql database docker

在构建我的应用程序时,我遇到了一个问题。我有一些包含信息的数据库表,我想重用于不同的应用程序。主要用于身份验证和用户权限。

这就是为什么我决定将我的数据库拆分成两个,一个用于用户数据(一个用于其他应用程序需要的数据),另一个用于应用程序相关数据(我只需要这个数据)。

在某些情况下,我需要从另一个数据库上的一个数据库引用外键。当数据库处于相同的连接时,我没有遇到任何问题。我是这样做的:

CREATE TABLE `database1`.`table1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `foreign_key` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `table1_foreign_key_foreign` (`foreign_key`),
  CONSTRAINT `table1_foreign_key_foreign` FOREIGN KEY (`foreign_key`) REFERENCES `database2`.`table2` (`id`)
);

现在这是我的问题。我开始了解Docker,我想为每个数据库创建一个容器。如果我的理解是正确的,那么每个容器都充当不同的连接。

甚至可以在不同的数据库连接上引用外键吗?

是否有另一种方法可以从另一个Docker容器引用外键?

非常感谢任何建议或意见。

2 个答案:

答案 0 :(得分:2)

由于多种原因,拥有外键交叉数据库边界是个坏主意。

  1. 向外扩展:您正在将数据库绑定到同一个实例。将数据库移动到新实例变得更加复杂,并且您绝对不希望最终在链接服务器上运行FK约束。请不。唐'吨
  2. 灾难恢复:您的DR流程存在重大风险。您的备份是否在完全相同的时间点捕获数据?如果不是,则存在恢复后相关数据不匹配的风险。即使相差几秒钟也会使关系的完整性失效。
  3. 不同的子系统:每个数据库都需要资源。有些是显式的,有些是共享的,但实例中运行的每个数据库都有开销。
  4. 安全性:每个数据库都有自己的安全实现。不同的登录和访问权限。如果DATA数据库中的用户需要针对USER数据库查找值,则您需要在两者中管理权限。按数据库隔离数据并不能解决或增强您的安全性,这只会使其变得更加复杂。管理敏感数据安全性的开销不会发生变化,您仍然需要根据数据(而不是数据的位置)来审核和管理用户和权限。您应该能够在单个数据库中实现完全相同的安全控制。

答案 1 :(得分:0)

不,那是不可能的。您不能将FK创建到不同的DB实例(或者您的情况下的其他Docker容器)。 您可以尝试在应用程序级别进行此检查。