【问题标题】:How to Maintain Foreign Key Constraint Across Different Databases?如何跨不同数据库维护外键约束?
【发布时间】:2010-10-14 22:59:12
【问题描述】:

我知道,我知道,将两个相关的表放在不同的数据库中并不是最好的设计实践。但无论如何,假设我必须绝对这样做。而且我必须将以前位于数据库中的两个与外键相关的表分解为两个数据库,位于两个不同的服务器上,但我仍然想维护数据库正直。最好的方法是什么?

编辑:我正在使用 MySQL 和 Symfony

【问题讨论】:

  • 我认为您需要告诉我们您使用的是什么数据库,答案(除了 JUST DON'T 之外)可能非常依赖于您的堆栈。
  • 这些表是在两个不同的mysql实例中还是在同一个mysql实例的两个不同目录中?
  • 嗯,其实表是在不同的数据库,这两个数据库是在不同的服务器上。

标签: mysql database-design symfony1


【解决方案1】:

你考虑过Federated tables吗?这些基本上是链接到托管在不同/相同主机上的不同数据库上的表。

您可以在本地创建一个联合表并使用它来强制引用完整性。但是,我怎么强调都不过分,因为这种方法充满了未来的陷阱,根本不推荐。

【讨论】:

  • FEDERATED 表根本不支持外键。在 4 月的 MySQL 大会上有一个演讲,关于未来在 MySQL 6.1 的分布式表中支持 FK 的可能性
【解决方案2】:

我想不出任何方法可以用标准 MySQL 做到这一点。

您可以为MySQL Proxy 编写一个插件,用于管理不同服务器上的父表和子表之间的引用完整性:

  • 针对子表拦截 INSERTUPDATE。查询父表中的匹配行。如果在父表中找不到匹配项,则失败 INSERT/UPDATE

  • 针对父表拦截DELETE。查询子表中的依赖行。如果在子表中找到任何相关行,则失败 DELETE。如果约束旨在支持级联行为,请这样做而不是失败。

  • 针对父表拦截UPDATE。如果主键值作为更新的一部分发生变化,则查询在子表中找到的相关行。如果在子表中找到任何相关行,则失败 UPDATE。如果约束旨在支持级联行为,请这样做而不是失败。

请注意,您必须在 MySQL 代理插件中保留有关参照完整性约束的信息(或为记录关系的插件编写自定义配置文件)。您不能使用传统的FOREIGN KEY 语法来跨 MySQL 实例声明此类约束。

【讨论】:

    猜你喜欢
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多