sql >> データベース >  >> RDS >> PostgreSQL

ポリモーフィック関連の外部キー制約。これは良い解決策ですか?

    PostgreSQLのINHERITSで私が抱えている最大の問題 実装では、親テーブルへの外部キー参照を設定することはできません。 たくさんがあります あなたがそれをする必要がある場合の。私の答えの最後にある例を参照してください。

    Railsの外部でテーブル、ビュー、またはトリガーを作成するかどうかの決定は重要です。そうすることを決心したら、私はあなたが見つけることができる最高の構造を使用したほうがよいと思います。

    私は長い間、ベースの親テーブルを使用し、外部キーを使用して互いに素なサブタイプを適用してきました。この構造は、1つの関連付けのみが存在できること、および関連付けが親テーブルの正しいサブタイプに解決されることを保証します。 (ビルカーウィンのSQLアンチパターンに関するスライドショー 、このアプローチはスライド46から始まります。)これは単純なケースではトリガーを必要としませんが、通常、サブタイプごとに1つの更新可能なビューを提供し、ビューを使用するにはクライアントコードが必要です。 PostgreSQLでは、更新可能なビューにはトリガーまたはルールのいずれかを記述する必要があります。 (9.1より前のバージョンにはルールが必要です。)

    最も一般的なケースでは、互いに素なサブタイプは同じ数または種類の属性を持っていません。だから私は更新可能なビューが好きです。

    テーブルの継承は移植可能ではありませんが、この種の構造は移植可能です。 MySQLに実装することもできます。 MySQLでは、CHECK制約を1行のテーブルへの外部キー参照に置き換える必要があります。 (MySQLはCHECK制約を解析して無視します。)

    データの重複を心配する必要はないと思います。そもそも、親テーブルと継承テーブルの間でデータが重複していないことは間違いありません。それはそのように見えるだけです。第二に、複製または 整合性がdbmsによって完全に制御されている派生データは、飲み込むのに特に苦い薬ではありません。 (ただし、制御されていない 重複です。)

    削除をカスケードする必要があるかどうかを考えてください。



    1. ワイルドカードをバインドするPHP

    2. 警告:mysql_query():指定された引数は有効なMySQL-Linkリソースではありません

    3. クエリを使用してSQLデータベースの疑わしいモードを通常モードに変更する

    4. データベースDockerコンテナにデータベースを作成するにはどうすればよいですか?