mysql - 不同数据库连接中的外键

标签 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 容器引用另一个容器的外键?

如有任何建议或意见,我们将不胜感激。

最佳答案

出于多种原因,跨数据库边界使用外键是一个坏主意。

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

关于mysql - 不同数据库连接中的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48443679/

相关文章:

Mysql:使用返回的部分数据行来获取更多数据

php - 如何修复 localhost 拒绝在 Windows 10 Wamp 服务器和 Xampp 上连接?

mysql - 如何使用where子句获取mysql对多列求和?

mysql - JPA 和 Hibernate - 复合主键与外键

java - 如何使用带日期的用户参数在 Java 中编写 MySQL 查询

nginx - 使用Docker --net = host并通过主机名连接到其他容器

.net - Entity Framework 和 ObjectContext.SaveChanges()

asp.net-mvc - 部署 ASP.Net MVC 应用程序

c# - 在 docker 容器中安装不同的框架

windows - Windows Docker git : cd: . git 错误:不是目录