2016-11-05 11 views
1

私はこれを行うには良い方法を見つけられなかったというこの質問があります。リンクされたフィールドの数を制限するための制約

'これらのルールを強制挿入機構(チェックを通じて、等、assertiontsをトリガ)

  • 本は3つの以上のフィールド(被験者)に連結することができない'
  • 書籍に関する情報を保持するブックテーブル(ISBN(PK)、タイトル、パブリッシャーなど) さらに、フィールド用の別のテーブルがあります。このフィールドには、外部キーとしてのISBN。

    私はアイデアを持っていたので、ISBNがリストに表示された回数を数えるようにしていました.3つ以上あれば、4番目を追加することはできません。それがどうやって正確に行われたのか、それとももっと良い方法であるのかはわかりません。

    ありがとうございます!

    subject1 subject2 subject3

    それが交差テーブルを使用していないので、これは完全に満足されていません。

    +0

    時々、あなたが望むものを簡単に実装する方法がないときは、あなたが望むものが賢明であるかどうかを疑問に思うべきです。ここでは、属性値モデルを実装しているように聞こえます。属性値モデルは、それらの属性が何であるか、存在する可能性があるかどうかわからないときに一般的に使用されます。その文脈では、「3つのフィールドを供給できるが、3つまでしか供給できない」ということは意味がありません。 –

    答えて

    0

    一つの簡単な方法は、booksテーブル内の3つの列を使用することです。しかし、それは必要を満たす。

    残念ながら、BookSubjectsテーブルを使用する場合、これはより困難です。この場合、NumSubjectsという列をBooksテーブルに追加し、値を3以下に保つ制約を追加できます。

    挑戦はそれを最新の状態に保ちます。これには、挿入と削除のトリガーが必要です。

    1

    リンク表に、整数列を追加 'iが' 2つの制約に:
    1)ユニーク(ISBN、I)
    2)検査(I)1〜3。

    +0

    これには、引き続きトリガが必要です。たとえば、書籍からサブジェクトを削除する場合などはどうなりますか? – mathguy

    +0

    このソリューションは、POが要求した1本あたり3つ以上のリンクを保証しません。加えて、book id列に定義された外部キーが存在する可能性があります。いずれにしてもトリガーは必要ありません。 –

    +0

    ISBNのユニークな制約は、POが要求した3冊以上の書籍を保証しません。それはポイントではありません。また、書籍ごとに3つのリンクも可能です。書籍に1.物理学、2.Astronomy、3.Philosophyのリンクがあり、最初の行が削除されると、1が再び利用可能になります。それをあなたのソリューションにどのように表示しますか? 'i'列はどのように(手動以外の)維持されていますか? – mathguy

    1

    1つの解決策は、refresh fast on commitという非常に単純なマテリアライズドビューを作成し、各ブックの件数を保持することです。次に、このマテリアライズド・ビューのcount列に制約を設定できます。これは一般に、トリガーより効率的でメンテナンスが簡単ですが、コミット時にのみ制約がチェックされるという欠点があります。これは、ユースケースでは問題ありません(トランザクションが頻繁に発生するテーブルではおそらくOKではありません)。

    +0

    はい、テーブルのサイズが比較的小さく、または非常に多くのプロセスがMVをリフレッシュしない場合、コミットMVの高速リフレッシュは1つの方法です。さもなければ、1つのプロセスだけが一度にMVをリフレッシュすることが許可されるので、競合待ちイベントである「JI」のためにパフォーマンスが低下します。 –

    +0

    @NicholasKrasnovしかし、何らかの種類のシリアライゼーションをせずにこれを実装する方法はありません。 –

    +0

    @DavidAldridgeもちろん。しかし、私たちは 'リンク'テーブルに変更を加えるたびに、このMVをリフレッシュしなければならないOLTPシステム(それのように見える)を見ています。 –

    関連する問題