0

私は2つのテーブルを持っていますCHECKLIST_INSTANCE:CHECKLIST_CLASS

CHECKLIST_INSTANCE外部キーを保存して、CHECKLIST_CLASS_IDそのインスタンスが使用しているチェックリストを把握できるようにします。

CHECKLIST_CLASS
   CHECKLIST_CLASS_ID
   REVISION
   NAME

CHECKLIST_CLASS のデータ例は次のとおりです。

  1, A, ABC Checklist
  2, A, XYZ Checklist
  3, A, QWE Checklist
  4, B, ABC Checklist

今問題になっているのは改訂です。チェックリストを改訂するとき、私の現在の戦略は、それに新しい代理主キーを与え、Rev を変更することです (checklist のようにABC Checklist)

CHECKLIST_CLASS_IDこの戦略では、 1 と 4 が関連 しているという関連性が失われているように感じます。

コンビネーション PK を使用するように設計を変更する場合CHECKLIST_CLASS

  1, A, ABC Checklist
  2, A, XYZ Checklist
  3, A, QWE Checklist
  1, B, ABC Checklist

次に、CHECKLIST_INSTANCE テーブルを変更して CHECKLIST_CLASS_REV を外部キーとして含める必要があり、すべてのクエリも変更する必要があります。

もう 1 つのオプションは、列を に追加することCHECKLIST_CLASSです。それぞれ PREVIOUS_REV_ID または NEXT_REV_ID のいずれか

  using a PREVIOUS_REV_ID field
  1, A, ABC Checklist, null
  2, A, XYZ Checklist, null
  3, A, QWE Checklist, null
  4, B, ABC Checklist, 1

.

  using a NEXT_REV_ID field
  1, A, ABC Checklist, 4
  2, A, XYZ Checklist, null
  3, A, QWE Checklist, null
  4, B, ABC Checklist, null

CHECKLIST_INSTANCE最後の 2 つの方法では、テーブルやクエリを変更する必要はありません。最高のデザインについて何か考えはありますか?または、調査する必要がある別のアプローチがありますか?

== 編集 明確にするために、私は CHECKLIST_CLASS テーブルの編集の監査証跡を探していません。

4

2 に答える 2

2

ここでの問題は、リビジョンをチェックリストに追加すると、チェックリストごとに 1 行のテーブルがなくなることです。チェックリストは別個のエンティティであるため、そのようなテーブルがあることを確認する必要があります。

リビジョンを別のテーブルに移動することをお勧めします。これにより、checklist_class、checklist_class_revisions、および checklist_class を参照する checklist_instance の 3 つのテーブルが作成されます。checklist_class には最新のチェックリスト リビジョンが含まれている可能性があり、チェックリスト リビジョン テーブルは履歴レコードになります。

あるいは、インスタンスをリビジョンにリンクする必要がある場合は、チェックリスト リビジョン テーブルをチェックリスト インスタンスの親にすることで、3 つのテーブル階層を作成できます。

于 2013-10-15T21:31:45.593 に答える
1

(@Davidの回答に対する私のコメントへの返信に返信します。)

ここには「依存」がたくさんあります。言い換えると、[Checlikst] には多くの [Revision] があり、[Revision] には多くの [Instance] があります。それは 3 つの外部キー関連のテーブルになります。しかし、問題は、これがあなたが実装しようとしているビジネス モデルを適切に表しているかということです。3 つの別個のエンティティを持つことは理にかなっていますか? これに対する答えは (最終的には部分的に) それらがどのように使用されるかに基づいています。リビジョンから独立した [チェックリスト] エンティティと、チェックリストのリビジョンのみに関連する [インスタンス] エンティティを持つことに価値と利点はありますか? または、[チェックリスト/改訂] は互いに十分に独立しているので、親子関係は本当に必要ありませんか? 一見、これは非正規化されたデータですが、しかし、それらを正規化する真の理由がない場合 (それらが別個のエンティティでない場合) は、不必要な余分な作業を自分自身に与えないでください。(私は、完全に正規化したいと思いますが、あなたの状況の詳細はわかりません。)

The hard part is the “crystal ball” work: you have to make a decision based on factors that may not yet be known (i.e. what will you need to do in a week, a month, a year?) The more familiar you are with the goals and purposes of the project, the better equipped you will be to make this decision. My advice: take time, think it through, and try to avoid snap decisions you may regret tomorrow. (You’ll have plenty of time to regret the informed bad decisions you’ll make, but your excuses for having made them will be better.)

于 2013-10-17T03:20:47.007 に答える