0

タイムシート オブジェクトを使用して Web アプリケーションを開発しました。このオブジェクトは、プロパティとして List を持っています。SQL Server では、これは Timesheets と TimesheetEntries の 2 つのテーブルに反映され、TimesheetEntries は Timesheets テーブルの PK (ID autonumber) を指す外部キーを持ちます。現在、タイムシート オブジェクトはグリッド上に表示され、ユーザーはエントリに挿入および修正を行い、最終的にそれを保存します。

タイムシートを保存する際に、すべてのタイムシート エントリを削除してから再作成します。もちろん、これにより、ユーザーがタイムシートを保存するたびに、TimesheetEntries の autonumber フィールドが押し上げられます。

これはこれを達成するための最良の方法ですか?これを行うより良い方法はありますか?

4

3 に答える 3

0

少し追加の作業を除けば、作業のやり方に大きな問題はありません。子オブジェクトの削除と再作成は、一般的なアプローチです。

ただし、自動インクリメント番号が押し上げられても実際には問題にならないはずです。すべてのタイムシート エントリは、対応するタイムシートの外部キーを介して取得できる必要があります。

自動生成された数字に頼るべきではありません。ID フィールドが上がっても問題ありません。本当の解決策は、代理キーが何であるかに関係なく、それらを正しく取得するための一貫した方法を見つけることです。

編集

ユーザーのコメントに応えて。

PK と FK には引き続き自動採番を使用しますが、それを大きなもの (通常はオブジェクト グラフの上部にあるもの) を一意に識別する手段と組み合わせる必要があります。

これを実装するには、データベースに Alias 列を含めます。

これは、明示的に検索したいものすべてに適用される独自の varchar 制約です。

次の例を考えてみましょう。

CREATE TABLE OrderTypes
(
  Id INT IDENTITY(1,1) PRIMARY KEY,
  Name varchar(100),
  Alias varchar(30),
  Active bit,
  ...
)

OrderTypeDB を最初から再構築する必要がある場合に変更される可能性があるため、ID で検索したくありません。

OrderType私も名前で検索したくありません。誰かが CMS 機能を介して注文タイプを変更した場合はどうなりますか?

Alias の概念により、各注文タイプに管理画面から編集できない短い名前を付けることができます。

例を続けると、発注書に " " というエイリアスを与え、販売注文OrderTypeに " " というエイリアスを与えるとします。purchaseordersalesorder

販売注文に関連する OrderType 行を取得したい場合は、次を使用できます。

SELECT * FROM OrderTypes WHERE Alias = 'salesorder'

この時点で、クエリには自動生成された ID があるため、その値に基づいてさらにクエリを実行できます。

SELECT * FROM Orders WHERE OrderTypeId = <that value I just safely derived>

これは、自動生成 ID をハードコーディングするよりもはるかに優れたアプローチです。

于 2012-10-31T10:48:44.780 に答える
0

タイムシート エントリを削除するのではなく更新してから、すべてを再作成する必要があります。主キーを使用すると、どのキーを更新する必要があるかを簡単に知ることができます。

また、Entity FrameworkNHibernateなどのオブジェクト リレーショナル マッパーを使用して、この多くを自動化することもできます。

于 2012-10-31T10:46:32.073 に答える
0

自動インクリメント ID 列の値は、ビジネス ドメイン内では関係ありません。これは、データ構造内の一意性および論理関係において純粋に使用されます。したがって、はい、このフィールドが増加しているのは問題ありません。とにかく、関係は TimeSheetEntry の FK と TimeSheet PK の間で発生します。

これらのレコードを削除して再挿入する代わりに、更新する方がよい場合があります。ここでの要件/ビジネス上の問題がよくわからないため、これ以上コメントすることはできません.

于 2012-10-31T10:47:41.027 に答える