2

デイケアセンター用の小さなデータベースを作成しました。私は識別関係と非識別関係について読んでいますが、全体についてまだ少し混乱しています. データベースの設計に MySQL Workbench を使用しています。

ここで、親と子の基準は、 aParentが 1 つ以上を持つことができ、その逆も同様です。したがって、とChildrenの関係は多対多です。(私が理解しているように)これを解決するための最善の方法は、3 番目のテーブルを作成し、それを他の 2 つの間の「接続」として使用することです。ParentsChildrenParets_Children

Parents - 1:n - Parents_Children n:1 - Children

ここで私が抱えている問題は、ここで識別関係を使用するかどうかです。論理的には、親がいなければ子供は存在できず、少なくとも 1 人の子供がいない限り、親は保育園のメンバーにはなりません。どちらも「単独」では存在しません。ただし、MysQL WB に整理してもらうと、非識別関係が作成されます (と思います)。
非常に単純化されたコード:

CREATE TABLE 'parents' (
  'id_parents' SMALLINT UNSIGNED NOT NULL ,
  'name' VARCHAR(48) NOT NULL ,
  PRIMARY KEY ('id_parents');

CREATE TABLE 'parents_children' (
  'id_parents' SMALLINT UNSIGNED NOT NULL ,
  'id_children' SMALLINT UNSIGNED NOT NULL ,
  PRIMARY KEY ('id_parents', 'id_children') ,
  FOREIGN KEY ('id_parents') REFERENCES 'parents' ('id_parents' )
  FOREIGN KEY ('id_children' ) REFERENCES 'children' ('id_children' );

CREATE TABLE 'children' (
  'id_children' SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT ,
  'name' VARCHAR(48) NOT NULL ,
  PRIMARY KEY ('id_children');

この出力は、目的の機能に到達するのに十分でしょうか? 私は関係全体を誤解していますか?私の質問があまりにも曖昧でないことを願っています。

4

3 に答える 3

2

あなたが提供したスキーマから、外部キー制約が table に存在することがわかりますparents_children。これにより、親と子の両方が存在する場合にのみ、親と子の間のリンクが存在できることが保証されます。

parentsただし、これはエントリをに挿入することを妨げるものではありませparents_childrenchildren

つまり、このスキーマでは、子がなくても親が存在できます。

ここでのロジックの問題は、関係を作成する前に親と子の両方を作成する必要があることですparents_children(外部キー関係のため)。ただし、探している追加のロジック (子なし、親なし、またはその逆) では、親または子を作成する前に、親と子の間のすべてのリンクが必要になります。

ここにニワトリ/タマゴの問題が見えますか?

于 2012-09-12T09:11:30.767 に答える
1

ジャンクション(別名リンク)テーブルで識別関係を使用するかどうかは、Parets_Childrenこのテーブルに使用する主キーの種類によって異なります。

{id_parents, id_children}すでに述べたように、関係を特定すると、「自然な」複合PKが生成されます。非識別関係を使用すると、(現在は代替の)キーに加え{id_parents, id_children}て、「代理」PKを使用できます。

サロゲートキーに特別な理由がない限り、ジャンクションテーブルに自然なPKを設定するだけで十分です。

論理的には、親なしでは子供は存在できず、少なくとも1人の子供がいない限り、親はデイケアのメンバーにはなりません。

残念ながら、少なくとも1人の子供の存在は、純粋に宣言的な手段で強制するのは簡単ではありません。実際(少なくとも私の知る限り)、親と子を一緒に挿入するときに鶏と卵の問題を解決するために必要な、遅延制約をサポートしないMySQLなどのDBMSに宣言的に強制することは不可能です。

もしそうなら(延期されたFKをサポートする)、親ごとに少なくとも1人の子の存在は、次のように宣言的に強制できます。

ここに画像の説明を入力してください

parentとの間の循環依存によって引き起こされる鶏が先か卵が先かという問題はparent_child、必要なすべての行が挿入されるまでFKの適用を延期することで解決されます。

現状では、アプリケーションコードでそれを行うか、正しい動作を保証するストアドプロシージャを作成し、それらを介してのみデータを操作する必要があります。

于 2012-09-12T11:43:32.073 に答える
1

論理的には、親がいなければ子供は存在できず、少なくとも 1 人の子供がいない限り、親は保育園のメンバーにはなりません。

これを実装するには、簡単な方法で.. 次のような列を持つことができる 1 つのテーブル をMyDayCare用意します。各親子ペアを一意に識別するため に、テーブルに他のカラムを含めることができます。RecordID, ChildID, ChildName, ParentID, ParentName
ChildIDParentIDDateOfBirth

子を削除すると、親も削除され、その逆も同様です。
同じ子の複数の親のレコードを (異なる行に) 保存することもできます。単純な SELF JOIN を使用することで、特定の子または親に必要なデータを取得できます。

これはデータベース テーブルを設計する最良の方法ではないことに注意してください。ただし、要件によっては、これも機能します。

于 2012-09-12T09:41:10.873 に答える