少し追加の作業を除けば、作業のやり方に大きな問題はありません。子オブジェクトの削除と再作成は、一般的なアプローチです。
ただし、自動インクリメント番号が押し上げられても実際には問題にならないはずです。すべてのタイムシート エントリは、対応するタイムシートの外部キーを介して取得できる必要があります。
自動生成された数字に頼るべきではありません。ID フィールドが上がっても問題ありません。本当の解決策は、代理キーが何であるかに関係なく、それらを正しく取得するための一貫した方法を見つけることです。
編集
ユーザーのコメントに応えて。
PK と FK には引き続き自動採番を使用しますが、それを大きなもの (通常はオブジェクト グラフの上部にあるもの) を一意に識別する手段と組み合わせる必要があります。
これを実装するには、データベースに Alias 列を含めます。
これは、明示的に検索したいものすべてに適用される独自の varchar 制約です。
次の例を考えてみましょう。
CREATE TABLE OrderTypes
(
Id INT IDENTITY(1,1) PRIMARY KEY,
Name varchar(100),
Alias varchar(30),
Active bit,
...
)
OrderType
DB を最初から再構築する必要がある場合に変更される可能性があるため、ID で検索したくありません。
OrderType
私も名前で検索したくありません。誰かが CMS 機能を介して注文タイプを変更した場合はどうなりますか?
Alias の概念により、各注文タイプに管理画面から編集できない短い名前を付けることができます。
例を続けると、発注書に " " というエイリアスを与え、販売注文OrderType
に " " というエイリアスを与えるとします。purchaseorder
salesorder
販売注文に関連する OrderType 行を取得したい場合は、次を使用できます。
SELECT * FROM OrderTypes WHERE Alias = 'salesorder'
この時点で、クエリには自動生成された ID があるため、その値に基づいてさらにクエリを実行できます。
SELECT * FROM Orders WHERE OrderTypeId = <that value I just safely derived>
これは、自動生成 ID をハードコーディングするよりもはるかに優れたアプローチです。