2017-12-08 4 views
0

私の現在のdbデザインはスクリーンショットにあります。 t_criteria_directorとt_criteria_a b c d e f ...テーブルの間には強制的な関係(pk/fk)がないので、問題があるようです。参照整合性を維持するために、この1対多のシナリオを設計するより良い方法はありますか?次のシナリオでdb関係(pk/fk)を維持する手段はありますか?

Proposed DB Design

+0

value_aのみの必須のテーブルと他の完全性制約のあるテーブルに対する標準の一対多の関係が欲しいようです。それ以外の場合は、1対1の関係を常に「シミュレート」して、FKの制約を強制することができますが、1対1の関係は退屈で断片化する傾向があります。 – DevilSuichiro

+0

この図のすべての内容について、[このテキストの場合は画像/リンクではなくテキストを使用してください](https://meta.stackoverflow.com/q/285551/3404097)をご利用ください。 – philipxy

+0

情報ありがとう、私は今日何か新しいことを学びました。次の投稿では画像を追加しません。 – KeelRisk

答えて

1

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

SQL NULL、UNIQUE、PK & FKは制約の種類です。制約は、表示可能なデータベース値の制限です。 SQL FKによると、テーブル内の列リストのサブロー値は、列がSQL UNIQUE NOT NULL列セット(PKの場合)をテーブル内に持つ列リストのどこかに表示する必要があります。デザインに制約の対象があり、それが他の強制制約によって暗示されていない場合は、それを実施します。それ以外はしないでください。好ましくは宣言的にほとんどのSQL DBMSでは、いくつかの種類の安価から強制的な制約を宣言できます。他のものは、トリガによって強制されなければならない。

制約が与えられた状況でテーブルの外泊対に入る行の基準の結果である(表述語、「どのようなテーブルの意味」)と&はに応じて発生することができないことができるものな状況あなたのビジネスルール私たちは、あなたが私たちに言わない限り、それらが何であるかを知らない。テーブル&のカラム名を使用して推測することができます。その他の情報は&常識です。

あなたたち制約や状況が/発生しないことができどのような述語&のいずれかを伝える必要があります。

この表では、簡単なテーブルといくつかのEAVデザインを使用して、簡単なテーブルのデータをデザインに明示的に記録していません。いつものようにあなたちょうど日まで&制約簡単なテーブルのスキーマを維持するためにDDLを使用してEAVを避けることができ、代わりにあなたがより複雑なスキーマを必要とする静的なスキーマを選択している、&制約を照会します。 EAV制約の直接的な表現は、典型的には、それらが表す直接的な表に一定の制約があり、t_criteria_xはそれのビューであり、かつ/またはそれらのビューであることである。しかし、一般的に利用できる唯一のSQL宣言では、その断片を表現できます。

私はあなたがここつもりは各t_criteria_xテーブルのためのPK値がTABLE_NAME値「t_criteria_x」でt_criteria_directorに表示されなければならないことを含んでいることを推測。これを配置する別の方法は、あなたが価値を持つTABLE_NAME列「t_criteria_x」をt_criteria_xする追加した場合、結果は(ID、TABLE_NAME)サブ行がt_criteria_director(criteria_id、table_nameの)サブ行として表示されなければならないということです。 t_criteria_director(criteria_id、TABLE_NAME)サブ行がSQL UNIQUE NOT NULLであれば、我々は、その増補t_criteria_xが複合SQL FK(IDは、table_name)を参照t_criteria_director(criteria_id、TABLE_NAME)を持っていることがあります。あなたが実際にそのような(おそらく計算/生成/計算)カラムによりt_criteria_x増強することによって宣言これを表現することができます。しかし、あなたはおそらくも存在しないように、他の制約を持っている任意の(constraint_id、table_nameの)いくつかの増補t_constraint_xによって参照されていないt_criteria_directorでペア。その列は、型/変異型判別/ t_criteria_xテーブル内のIDによって表されるエンティティのタイプは、「サブタイプであることをERセンスタグあるため、列TABLE_NAMEを呼び出す

はEAVから実装指向のバイアスを示していますt_criteria_directorによって表されるエンティティの型の " (これは、動的にタイピングをシミュレートするために使用される3GLレコードのデータ構造からの概念/技術です。)すべてのtable_name列の値がテーブル名である必要はなく、エンティティのサブタイプを識別する値である必要があります。そのようなエンティティは、1つのテーブルの関係/関連に参加するだけである必要はありません。 (SQL /データベース/ ERのサブタイプ/多型/継承の研究と、2 /複数/複数のFKの設計を2 /複数/複数のテーブルに適用する)

テーブル述語が何であるかを判断する必要があります。結果的に彼らの制約は何か。好ましくは、それらが集合的に表す直接的な表が何であるかを決定することによって、その述語が何であるか、およびデータベース制約がそれをどのように使用しているかが決定される。次に、コスト/メリットごとにデザインを修正して、宣言的な制約を設定するか、トリガーを介して制約を適用するかどうかを決定する必要があります。

+0

私はjsonフィールドを含むONE criteriaテーブルを使用することに決めました。したがって、何百ものcriteria_a、b、c ...テーブルが必要になることはありません。この特定のケースでは、これらのフィールドのいずれも照会する必要がないため、これは完全に機能します。 – KeelRisk

+0

ある程度深いツリー構造の関係があり、その部分を一般的または関係的にクエリしたい場合(たとえば、任意の深さのJSONデータで始める場合など)は、CTEクエリと[heirarchical data](https: //stackoverflow.com/q/4048151/3404097)。 – philipxy

関連する問題