Ann*_*nna 7 mysql foreign-key database-design data-integrity
MySQL 允许创建跨数据库外键 - 但这是确保数据完整性的好方法吗?是否可以给出一般性答案,还是取决于项目?它有哪些优势和威胁?
假设有两个数据库,A 和 B,它们通常存储不同的信息用于不同的目的和不同的数据上传方式,但是数据的某些部分可能出现在两个数据库中。现在让我们假设一个人想要确保这个小交叉点的所有东西都已经在 B 中结束了。在这种情况下,外键是个好主意吗?
MySQL 允许创建跨数据库外键 - 但这是确保数据完整性的好方法吗?是否可以给出一般性答案,还是取决于项目?它有哪些优势和威胁?
MySQL 并没有真正的“数据库”概念。这是因为 MySQL 将“数据库” “进化”为“模式”,但从未真正修复它。如果您正在与真正的 DBA 交谈,这不是跨数据库的外键。所以对于 MySQL 来说,这是完全可以接受的。
CREATE SCHEMA 是 CREATE DATABASE 的同义词。
例如,在 PostgreSQL 中,我们有“模式”和“数据库”。并且跨模式外键完全没问题,但是你不能做跨数据库的 fkeys。
psql (9.6.3, server 9.5.6)
You are now connected to database "foobar" as user "ecarroll".
foobar=# CREATE TABLE foo ( id int primary key );
CREATE TABLE
foobar=# INSERT INTO foo SELECT * FROM generate_series(1,10);
INSERT 0 10
foobar=# \connect test;
psql (9.6.3, server 9.5.6)
You are now connected to database "test" as user "ecarroll".
test=# CREATE TABLE foo ( id int references foobar.foo.id, name text );
ERROR: cross-database references are not implemented: "foobar.foo.id"
Run Code Online (Sandbox Code Playgroud)
这就是跨数据库 fkey 的样子。请注意,它需要明确的架构规范,我不知道任何实现架构的数据库和允许它的数据库。
MySQL 混淆数据库和外键的缺点非常明显。如果您拥有对单个特定数据库的完全访问权限,则无法组织自己的内容。而在 PostgreSQL 中,如果您可以完全访问单个数据库,则可以创建任意数量的任意模式。你不需要超级用户,也不需要能力CREATE DATABASE