web-dev-qa-db-ja.com

データベース間の外部キーとデータベース設計のベストプラクティス

MySQLでは、データベース間の外部キーを作成できますが、データの整合性を確保するための優れた方法ですか?一般的な答えを出すことは可能ですか、それともプロジェクトに依存していますか?利点は何であり、それがもたらす脅威は何ですか?

AとBの2つのデータベースがあり、一般に異なる目的のために異なるデータを異なる方法でデータをアップロードするとしますが、データの一部が両方のデータベースに表示される場合があります。次に、この小さな交差点のうち、Bになるすべてのものが事前にAにアップロードされていることを確認したいとします。この場合、外部キーは良いアイデアですか?

5
Anna

MySQLでは、データベース間の外部キーを作成できますが、データの整合性を確保するための優れた方法ですか?一般的な答えを出すことは可能ですか、それともプロジェクトに依存していますか?利点は何であり、それがもたらす脅威は何ですか?

MySQLには実際には「データベース」の概念はありません。これは、MySQLが "進化" "データベース"と "スキーマ"の混同 であり、実際には修正されていないためです。実際のDBAと話している場合、これはデータベース間の外部キーではありません。 MySQLの場合、これは完全に問題なく許容できます。

MySQLのバージョン8.0でも

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も必要ありません

4
Evan Carroll