投稿者 SSD  (社会人) 投稿日時 2023/2/27 13:53:22
.NET FrameworkにおいてDapper(O/Rマッパー)を用いてSQL ServerのレコードのSelectとInsertをマッピングして行っています

SQL Serverには
親テーブルA
子テーブルB
孫テーブルC
というテーブルがあり、それぞれにIdentityとなる値があります
また、AのIdentityの値をBのレコードに、
BのIdentityの値をCのレコードに記録してリレーショナルにしています

それぞれ
A:= クラスαのプロパティ値を記録するためのテーブル
B:= クラスβのプロパティ値を記録するためのテーブル
C:= クラスβのプロパティγ(コレクション)の値を記録するためのテーブル
となっておりテーブルやクラス、プロパティの関係性は
A:B(α:β) = 1:n
B:C(β:γ) = 1:n
という状態です

ABCにレコードを記録する場合以下のようにしています
(1) αのプロパティー値をDapperのパラメータに渡す
(2) Aに(1)の値でレコードを1行Insert
(3) (1)でInsertしたレコードのIdentityの値を取得
(4) (3)の値とクラスβのコレクションの各要素からパラメータ値を抽出してDapperのパラメータに渡す
(5) (4)の際にγはコレクション(List(Of String)))からXML(String型)に変換してパラメータに渡す
(6) Bに(4)の値で1行Insert(γの値以外)
(7) (6)でInsertしたレコードのIndentity値を取得
(8) γのXMLをテーブルに変換し(7)の値と合わせてCに複数行Insert
(9) (6)~(7)をDapperが繰り返す

上記はストアドプロシージャの実行で済ませています
(5)について、SQL Serverではコレクションや配列を受け取ってくれる変数がないのでXMLに変換しています
(9)について、(4)でパラメータをコレクションにしてDapperに渡すとコレクションの数だけDapperがInsertしてくれます

期待している通りの挙動はしてくれるのですが、
1:nの関係が親テーブルから孫テーブルまであり、
それぞれのテーブルのIdentityの値をもとにリレーショナルにしている場合に、
果たしてこのやり方がパフォーマンス的にベストなのか疑問に思いながらコーディングしていました

この方法について皆さんはどう思われますか?
また、どのような方法がベストだと思われますか?
ご意見いただければ幸いです