2017-05-05 1 views
-1

ここにDBの完全なnewb ...私の地域の周りの孤児院を助ける簡単なプログラムを作ろうとしています。質問:テーブルAとテーブルBがテーブルCを外部キー制約を参照しているとします。テーブルBの要素Yが既にXを参照している場合、テーブルCの要素Xを参照するテーブルAの挿入をブロックする方法はありますか?他の2つのテーブル間の参照が存在する場合、テーブルへの挿入をブロックする方法はありますか?

表A:空
表B:Y(参照用X)
表C:Z(参照のX)を挿入するX

試みテーブルで

表A:Z(参考X )< < ---
表Bブロックされた:Y(参照用X)
表C:X

初心者くさい質問して申し訳ありません

、と私の最初の試みを私はいくつかの研究を行っているが、私はこの状況を探すために検索バーを置くための適切な用語を知らない。テーブルAとBは、生徒と教師のように相互に関連するサブタイプのいくつかの並べ替えているように聞こえる

+0

埋め込みsqlite – Mateus

+0

ようこそStackoverflow!私はここで少しの理論を知る必要があると思う。依存関係、参照整合性など。 – bonCodigo

+0

はい@bonCodigo、最近読んでいます。私はそれについて読んで、この問題(排他的なサブタイプを扱っている)はこれに対して「受け入れられた普遍的な答え」がなく、再発していることを発見しました。私はdb開発に慣れていないので、通常の開発者よりも多分苦労しています。今、私の問題はSQL内にすべての「db-to-reality-representation」の一貫性チェックを入れようとしているようですが、それを使ってアプリケーション層に何の責任も与えません...もう一つの戦争です。私はSQLのすべてのルールを見て、それが行く方法ではないと思うが大好きだ。 – Mateus

答えて

0

私が間違っているかもしれませんが、あなたは間違った問題を解決しようとしているように私には見えます...

、ここでの教師の一例が、それはあなたが持っているしたいの関係に応じて、とても似

を扱うことができ、他のエンティティのためにすべて同じだ - ...両方私は学生に固執するだろう人物

です生徒または教師である人物の状態は、人の表の中で、どのサブタイプ例えば、ある人があるケースでは学生であり、別のケースでは教師であるというケースがある場合は、人は、またはそれは別の具体的な関係の一部になることができます...


[:このようになります。A、BおよびC、それを使用して、抽象の世界に

(弁別フィールドには、コンクリートの関係につき1つの識別器を得るような関係を記述したテーブルに移動します) A1]
[A2]

B
[B1]
[B2]

C
【のC1]

R
[R1、C1、A1; NULL; A]

Rの列があるが:
PK
Cリファレンス
参照
B参照
識別器

と、列C refを一意に制限するRの制約

ユニークなのは、記述した不要な追加参照を防止し、Aへのエントリをまだ持つことができるので、挿入をRにブロックすることです。既に参照されているCエンティティで十分でしょう)

+0

助けてくれてありがとう。はい、これは確かにサブタイプの問題です...しかし、あなたの提案された解決策はRに[R1; C1、A1、B1、A]項目を挿入することを許してしまい、それは矛盾しています...いくつかの研究の後、私が直面している問題は、SQLの内部にすべてのビジネスロジックと一貫性の保守を入れようとしていることです...そして、おそらく多くのトリガー、ストアドプロシージャー、関数が必要です...これは簡単ではありません純粋なSQLは、これらのもののほとんどは、DBを使用してアプリケーションで実装するのが簡単です、特にDBは他のアプリケーションで使用されない場合... – Mateus

+0

@マテウス...あなたのDBMSによると、これは非常に行うことができます単純なファッション... Rの参照列のうちの1つを挿入/更新時にNULLに設定するトリガーを持つか、正しい参照列のみが埋め込まれているかどうかをTSQLのCHECK制約テストのように知ることができます – DarkSquirrel42

関連する問題