MySQLでは、データベース間の外部キーを作成できますが、データの整合性を確保するための優れた方法ですか?一般的な答えを出すことは可能ですか、それともプロジェクトに依存していますか?利点は何であり、それがもたらす脅威は何ですか?
AとBの2つのデータベースがあり、一般に異なる目的のために異なるデータを異なる方法でデータをアップロードするとしますが、データの一部が両方のデータベースに表示される場合があります。次に、この小さな交差点のうち、Bになるすべてのものが事前にAにアップロードされていることを確認したいとします。この場合、外部キーは良いアイデアですか?
MySQLでは、データベース間の外部キーを作成できますが、データの整合性を確保するための優れた方法ですか?一般的な答えを出すことは可能ですか、それともプロジェクトに依存していますか?利点は何であり、それがもたらす脅威は何ですか?
MySQLには実際には「データベース」の概念はありません。これは、MySQLが "進化" "データベース"と "スキーマ"の混同 であり、実際には修正されていないためです。実際のDBAと話している場合、これはデータベース間の外部キーではありません。 MySQLの場合、これは完全に問題なく許容できます。
CREATE SCHEMAはCREATE DATABASEの同義語です。
たとえば、PostgreSQLには「スキーマ」と「データベース」があります。また、スキーマ間の外部キーは完全に問題ありませんが、データベース間のfkeyは実行できません。
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"
それがクロスDB fkeyのようになります。明示的なスキーマ指定が必要になることに注意してください。スキーマを実装するデータベースとそれを許可するデータベースについては知りません。
MySQLの紛らわしいデータベースと外部キーの欠点はかなり明らかです。 1つの特定のデータベースへのフルアクセス権がある場合、独自のコンテンツを整理することはできません。一方、PostgreSQLでは、単一のデータベースへのフルアクセスがあれば、任意のスキーマをいくつでも作成できます。 SUPER USERもCREATE DATABASE
も必要ありません