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

次のシナリオでdb関係(pk / fk)を維持する方法はありますか?

    私たちはあなたの心を読むことができないので、あなたのデザインは何も「見えません」。あなたはデザインのいくつかの側面を示しましたが、それが表す/実装する/説明するビジネスの「シナリオ」やその方法については説明していません。

    SQL NULL、UNIQUE、PK、およびFKは一種の制約です。制約は、表示できるデータベース値の制限です。 SQL FKによると、テーブル内の列リストのサブ行値は、その列がテーブル内のSQL UNIQUE NOT NULL列セット(PKの場合)を形成する列リストの別の場所に表示される必要があります。デザインに制約があり、他の強制された制約によって暗示されていない場合は、それを強制します。それ以外の場合はしないでください。できれば宣言的に。ほとんどのSQLDBMSでは、数種類の安価な制約のみを宣言できます。その他は、トリガーを介して強制する必要があります。

    制約は、特定の状況でテーブルに入る行とテーブルから離れる行の基準の結果です(テーブルの述語 、「テーブルの意味」)、およびビジネスルールに従って発生する可能性のある状況と発生しない状況。あなたが私たちに言わない限り、私たちはそれらが何であるかを知りません。私たちはあなたのテーブルと列の名前、あなたが与える他の情報と常識を使って推測することを望むことができます。

    あなた 私たちに伝えなければなりません 制約または述語のいずれか、およびどのような状況が発生する可能性があるか、発生しないか。

    ここでは、テーブルは単純なテーブルとEAVデザインを使用して、デザインに明示的に含まれていない単純なテーブルのデータを記録しています。いつものようにできた DDLを使用して単純なテーブルのスキーマと制約を最新の状態に保つことにより、EAVを回避しますが、代わりに、より複雑なスキーマ、クエリ、および制約を必要とする静的スキーマを選択しました。 EAV制約の単純な表現は、通常、それらが表す単純なテーブルに特定の制約があること、およびt_criteria_xがそのビューである、および/またはそれがそれらのビューであるということです。ただし、通常、使用可能なSQL宣言は、そのフラグメントを表現できるものだけです。

    推測 ここで意図しているのは、各t_criteria_xテーブルについて、そのPK値がtable_name値't_criteria_x'とともにt_criteria_directorに表示される必要があることです。別の言い方をすれば、t_criteria_xに値't_criteria_x'のtable_name列を追加した場合、結果には(id、table_name)サブ行がt_criteria_director(criteria_id、table_name)サブ行として表示される必要があります。 またの場合 t_criteria_director(criteria_id、table_name)サブ行はSQL UNIQUE NOT NULLであるため、拡張されたt_criteria_xには、t_criteria_director(criteria_id、table_name)を参照する複合SQL FK(id、table_name)があります。このような(おそらく計算/生成/計算された)列によって実際にt_criteria_xを拡張することにより、これを宣言的に表現できます。ただし、拡張されたt_constraint_xによって参照されない(constraint_id、table_name)ペアがt_criteria_directorにないなど、他の制約もある可能性があります。

    列table_nameを呼び出すと、その列がタイプ/バリアント識別子/タグであるため、EAVからの実装指向のバイアスが示されます。 ERの意味では、t_criteria_xテーブルのIDで表されるエンティティのタイプは、t_criteria_directorで表されるエンティティのタイプの「サブタイプ」です。 (これは、タイピングを動的にシミュレートするために使用される3GLレコードデータ構造の概念/手法でもあります。)すべてのtable_name列の値はテーブル名である必要はなく、エンティティのサブタイプを識別する値である必要があります。このようなエンティティは、1つのテーブルの関係/関連付けにのみ参加する必要はありません。 (SQL/データベース/ERサブタイピング/ポリモーフィズム/継承および設計アンチパターン2/多/複数のFK[原文のまま]を2/多/複数のテーブルに調査します。)

    テーブル述語が何であるか、そしてそれらの制約が結果的に何であるかを決定する必要があります。できれば、それらが集合的に表す単純なテーブルとは何か、その述語とは何か、データベースの制約がそれを使用しているものを判別することによって。次に、コスト/メリットごとに設計を変更して制約を宣言型にするか、トリガーを介して制約を適用するかどうかを決定する必要があります。




    1. PHP PDOでクエリが正常に実行されたことを確認するにはどうすればよいですか?

    2. MSAccessに問題を引き起こしている新しいデータ型を修正する方法

    3. データベースが更新されるたびにC#クライアントを更新します

    4. 標準入力を使用してSwift3.0でプロセスを実行する方法