私は本番作業(特にラボテスト)用のデータベースを作成しています。
ほとんどのWork
は本番用であるため、そのProcedure
のProduct
に従って厳密に実行されます。それ自体で、これは簡単にモデル化できます。 Work
は、作業の実行方法が含まれているため、Procedure
を参照します。
Example Schema
Work: Work_id, Procedure_id, {other non-relevant fields}
Procedure: Procedure_id, Product_id, Machine_id, Material_id, RunMinutes
2つの例外(オーバーライドと特別なテスト)により、設計が非常に複雑になります。
質問:以下の2つの例外を考えると、各Procedure
に実際に使用されたWork
フィールドをどのように保存する必要がありますか?
例外-オーバーライド:
必要な機器やコンポーネントが利用できない場合があります。このような場合、マネージャーは同等の代替品の1回限りのオーバーライドを承認できます。例:
Work
を手動で実行します。データベースは、Work
が実際にどのように実行されたかをキャプチャする必要があります。
3つの可能なオプションがあります。
オプション1:ローカルに保存:Work
は元のProcedure
を参照します。各Work
は、変更を含め、使用されたProcedure
フィールドもローカルに保存します。これにより多くの重複が作成されますが、Work
ごとにローカルの「スナップショット」があります。
Example Schema
Work_id | Procedure_id | Machine | Material | RunMinutes
1 | 1 | By-Hand | Z | 45
Procedure_id | Product_id | Machine | Material | RunMinutes
1 | 1 | X | Y | 45
オプション2:シングルユース手順:元のProcedure
が新しいProcedure
にコピーされ、非アクティブとしてマークされ、オーバーライドで変更されます。次に、Work
は新しいProcedure
を参照します。これにより、Work
が実行された方法のWork.Procedure_id
が維持されます。
Example Schema
Work_id | Procedure_id
1 | 2
Procedure_id | Product_id| Active| Machine | Material | RunMinutes
1 | 1 | Y | X | Y | 45
2 | 1 | N | By-Hand | Z | 45
オプション3:オーバーライドとして保存:Work
はProcedure
を指し、オプションでProcedureOverride
テーブルを指します。 Procedure
の各フィールドについて、オーバーライドがある場合はそれを使用し、そうでない場合はProcedure
値を使用します。
Example Schema
Work_id| Procedure_id| Override_id
1 | 1 | 1
Procedure_id| Product_id| Machine | Material | RunMinutes
1 | 1 | X | Y | 45
Override_id | Machine | Material | RunMinutes
1 | By-Hand | Z | NULL
Query: ActualWork
Work_id |Procedure_id | Machine | Material | RunMinutes
1 | | By-Hand | Z | 45
例外-特別なテスト:
非標準的な作業(研究開発など)の場合、特定のProcedure
はありません。この場合も、データベースはWork
が実際にどのように実行されたかをキャプチャする必要があります。
2つのオプションが表示されます(上記のそれぞれのオプションと同等)
オプション1:ローカルに保存:各Work
は、使用されたすべてのProcedure
フィールドをローカルに保存します。ユーザーは各フィールドに値を入力する必要があります。
オプション2:シングルユース手順:新しいProcedure
が作成され、非アクティブとしてマークされ、ユーザーによって入力されます。次に、Work
は新しいProcedure
を参照します。これにより、Work
が実行された方法のWork.Procedure_id
が維持されます。
ただし、非標準のProcedure
には実際の(現実の)Work
はありません。
したがって、これは主に適切なデータの正規化に関する質問のようです。
データの正規化を念頭に置いて、オプション1を簡単に除外できます。ご提案のとおり、データは明らかに正規化されておらず、繰り返されます。
オプション3は、ドメインをキャプチャしていない現在のスキーマを処理するためのハックのように見えます。このようなハックを実装する必要がある場合は、間違いなく再設計の時期です。
これでオプション2が表示されます。3つのオプションのうち、これが最適のようです。ただし、スキーマはさらに適切な正規化が可能であるように思われます。ドメインについて詳しく知らなくても、Machine、Material、RunTimeの間にはおそらく何らかの機能依存性があると思います。または、製品IDが含まれる場合もあります。もちろん、これらの4つの値すべてが他の値に影響を与えることなく自由に異なる場合は、スキーマ最適化のこの領域は無視できます。
プロシージャテーブルに機能依存性が存在しない場合は、オプション2で提案されているように、カスタム作業をキャプチャするための新しい「非アクティブ」プロシージャを備えたスキーマが全体として最良の選択であるように見えます。
特定の作業/手順のペアに対して複数の例外が発生する可能性があり、各例外によって1つ以上の異なる手順フィールドが変更される可能性があると想定しています。
確かに各変更を独自の行に保存することはできますが(「オーバーライド」)、「現在の」設定または履歴ビューを取得しようとするクエリは複雑になります(特に、現在の設計(提示されているように)は複雑になるため)変更が適用された順序を示す手段がないようです)。
提供された情報のみに基づいて、私はおそらく典型的な履歴/監査ソリューションを選択します:
作業と手順の間の1-1の関係を維持する
例外が必要な場合は、Procedureを新しい値で更新します
procedureのトリガーは、古いレコードを監査/履歴テーブル(Procedure_histなど)に書き込みます。同じ列に加えて、順序を指定するための1つの追加列(seq_no、modification_datetimeなど)があります。
現在の作業/手順の構成を確認したい場合は、作業と手順に参加します。例:
選択... 作業からw 手順p に参加w.Procedure_id = p.Procedure_id
履歴/監査ビューを表示する必要がある場合は、Procedure_histテーブルを、おそらく外部結合としてプルできます。例:
select ... from Work w join Procedure p on w.Procedure_id = p.Procedure_id left join Procedure_hist h on w.Procedure_id = h.Procedure_id
これは、オプション#2のわずかなバリエーションです。はい、それはデータの重複を意味しますが、コーディング(更新、取得)も簡単になり、将来の保守が少し簡単になる可能性があります(特に誰かがあなたの後ろに来てシステムを保守する場合)。 [K.I.S.S.原則が思い浮かびます。]
ユースケース、アップストリーム/ダウンストリームの要件などについて詳しく知らなくても、同じWork-Procedure-Procedure_histの関係で特別なテストを維持することが理にかなっているのかどうかを確認したいと思います。
作業(または手順?)が標準の場合か特殊な場合かを指定するフラグを追加できます。
モデルに影響を与える可能性のあるその他の考慮事項は、作業手順です。厳密に1対1の関係であるか、多対1 /多対多の関係が存在する可能性があります。例:
単一の手順をさまざまな作業で(再)使用できますか?
1つの作業を複数の手順に分割できますか?
[〜#〜] lims [〜#〜] システムを構築しようとしているようです。
私が遊んだものには、2セットのテーブルが含まれていました。
1セットのテーブルには、「実行する予定の内容」が含まれています。
別のテーブルセットには、「実際に行われたこと」が含まれています。
2セットのテーブルはほとんど同じです。
このスキーマ設計により、通常のWork
の実行による変更に加えて行われた追加のProcedure
をキャプチャできます。
Procedure
のステップ3でマシンBを使用する必要があるとします。マシンBが壊れています。マネージャーがマシンAの使用を承認した後、Actual Work Done
のエントリは、マシンBではなくマシンAがステップ3に使用されたことを反映します。audit
テーブルは通常、マネージャーの承認への参照とともに含まれます。
R&Dの実行は、R&D Procedure
に属します。マネージャーの承認なしに、任意のWork
をActual Work Done
テーブルに追加できます。これらは、ユーザーにWork
の値を手動で入力させる必要があります。
システムキャリブレーションの実行は、キャリブレーション手順に属します。スタートアップの実行、「この100万ドルのおもちゃのしくみを見せびらかそう」の実行、「マシンに何かが詰まっているので、クリアされるまでブランクを実行しましょう」の実行についても同じことが言えます。
オフィシャルランはスムーズに動作します。公式実行とR&D実行の主な違いは、次のとおりです。公式実行では、ユーザーが入力する必要のあるフォームのWork
ごとに正しいパラメーターが入力されます。これにより、ユーザーは値を調整できます。 100%同一ではありませんでした。例-規定の1.000mgのNaClの代わりに1.001mgのNaClを使用しました。
全体として、これはオプション1のバリエーションです。