0

4 つのテーブル (A、B、C、D) があり、A は B および C との 1 対多の関係の親です。C と D は、テーブル D との 1 対多の関係の親です。概念的には、これらの主キーはテーブルは次のようになります。

  • A: 援助
  • B: Aid、bnum (A への外部キー付き)
  • C: Aid、cnum (A への外部キー付き)
  • D: Aid、bnum、cnum (B および C への外部キー付き)

「num」列は、各レコードではなく、関係の各親 ID に基づいて自動インクリメントされます。以前のアプリケーションでこのアプローチを使用しましたが、B レコードと C レコードの作成は、'select max()' クエリを介して新しい 'num' 値を生成する順次プロセスによって行われたため、問題ではありませんでした。私はこのアプローチに本当に満足したことはありませんでしたが、仕事はやり遂げました。

私が現在取り組んでいる特定のケースでは、テーブル A と B のレコードはユーザーによって入力されるため、ID の自動生成は問題になりません。テーブル C と D の場合、これらのテーブルのレコードは複数の同時バッチ プロセスによって生成されているため、それらの識別子を何らかの方法で生成する必要があります。私がリストした前の方法は、競合状態に対しては機能しません。

これは Oracle データベース用であるため、自動インクリメント列ではなくシーケンスを使用することに注意してください。

上記の制約がある場合、A、B、C、および D を表すテーブルをどのように設計すれば、エンティティ間の関係が適切に適用され、アプリケーション コードで識別子を生成する必要がなくなりますか?

4

2 に答える 2

0

シーケンスまたは自動番号は、アプリケーションではなく、常にデータベースシステムによって生成される必要があります。MSSQLの場合、これはストアドプロシージャを使用して実行でき、ストアドプロシージャから「select @@ IDity」を返して、挿入された行のIDをアプリに提供します。

シーケンスは主キーimoに最適ですが、「自然キー」の神を崇拝するキャンプがあります。

テーブルに格納されているデータの意味、および関係の意味は、質問に完全に答えるために重要ですが、関係によってカスケード削除が可能になる場合があります。

個人的には、各テーブルで主キーシーケンスを作成し、主キーの一部ではない外部キーを許可します。主要なオブジェクト(従業員、商品、店舗など)でテーブルを定義すると、それらの間の関係は組み合わせで構成されます。したがって、店舗の従業員はテーブル「storeemployee」を持ち、主キーはempidになります。 、シーケンスが定義されていないstoreid。通常、私はそれをオブジェクト(常に主キーのシーケンスを持つ)、およびオブジェクト間の関係(他のテーブルのIDをコンボ主キーとして使用する)の観点から考えます。

お役に立てば幸いです。

編集:これはダイヤモンドの関係をうまく可能にすることを付け加えなければなりません。「店舗」と「従業員」について考えてみてください。1つのテーブルは店舗従業員であり、別のテーブルは「店舗販売」である可能性があります。どちらも店舗と従業員を識別しますが、それらは大幅に異なることを意味します。1つはおそらく労働時間であり、もう1つは販売です。

于 2008-12-10T20:28:21.970 に答える
0

私がそれを正しく理解しているなら、あなたはあなたが持っているかもしれない解決策を持っていました

Table A
-------
100
101
102

Table B
-------
100 1
100 2
101 1

Table C
-------
100 1
100 2
101 1


Table D
-------
100 1 1
100 2 1
100 1 2
101 1 1

さて、「num」値が小さく、ギャップのないシーケンスであるかどうかは重要ですか? そうでない場合は、それらにもシーケンスを使用してください。だからあなたは得るかもしれません

Table B
-------
100 29125
100 29138
101 29130

Table D
-------
100 29125 401907
100 29138 404911
101 29130 803888

bnum と cnum には別々のシーケンスを使用します。選択すると、(必要に応じて)次のようなものを使用できます

SELECT AID, 
      RANK(BNUM) OVER (PARTITION BY AID ORDER BY BNUM) bnum_seq,
      RANK(CNUM) OVER (PARTITION BY AID ORDER BY CNUM) cnum_seq
于 2008-12-10T21:52:07.403 に答える