Actions
Feature #80
closed
RA
Feature #140: [TAK-135] 外部システムからEPAAアプリ定義を取り込む基盤を実装する
Feature #143: [TAK-132] Excel/CSVから業務アプリ定義(resource.yaml)を生成する
Feature #83: [TAK-192] Excel参照関係から参照マスタ候補を自動生成する
[TAK-195] TAK-192-A CSV取込前提とExcel整数IDの扱いを検証・設計する
Feature #80:
[TAK-195] TAK-192-A CSV取込前提とExcel整数IDの扱いを検証・設計する
Status:
Closed
Priority:
Normal
Assignee:
-
Start date:
09/30/2026
Due date:
% Done:
0%
Estimated time:
Description
Linear migration metadata¶
- Linear issue: TAK-195
- Linear URL: https://linear.app/takayuki-komoda/issue/TAK-195/tak-192-a-csv取込前提とexcel整数idの扱いを検証設計する
- Linear status: Done
- Linear team: Takayuki Komoda
- Linear project: EPAA App
- Linear assignee: Takayuki Komoda
- Linear labels:
- Linear created: 2026-07-12T21:49:22.405Z
- Linear updated: 2026-07-12T23:11:17.850Z
- Linear archived:
Original description¶
目的¶
TAK-192の参照マスタ自動生成に入る前に、生成アプリのCSV import前提とExcel上の整数ID列の扱いを確定する。
対応内容¶
- 生成アプリCSV importで、新規行のDB
idがCSVに不要でSerial/BIGSERIALにより自動採番されることを確認・テスト化する。 - relation項目が
xxx_id__code形式で参照先のcode_fieldから解決できることを確認・テスト化する。 - Excel上にもともと整数IDが振られている場合、その列を参照マスタのID候補として扱えるようにする。
- Excel整数IDをDB主キー
idとして直接投入する方式と、元ID/業務キー列として保持してcode_fieldにする方式の安全性を比較し、TAK-192で採用する方式を決定する。 - 採用方式に応じて、Excel整数IDを親アプリCSVの参照解決キーとして利用できることを受入条件に含める。
受入条件¶
- 新規CSV取込でDB
idが自動採番されることがテストで確認できている。 - Excel整数IDを参照先マスタとの照合キーとして利用する仕様が明文化されている。
- DB主キーへ直接投入する場合は、sequence整合性と既存データ衝突の扱いが明確になっている。
- 直接投入しない場合は、Excel整数IDを保持する項目と
code_fieldとしての利用方法が明確になっている。
Linear attachments¶
Linear comments¶
{"id" => "9aded6b7-dac6-4cf8-920a-d263232a992d", "name" => "Takayuki Komoda"} (2026-07-12T23:11:17.876Z)¶
PR #106 が develop に merge されたことを確認しました。
- merge commit:
1971a189 - local
developもorigin/developに fast-forward 済み - ローカル作業ツリー clean
TAK-195 は開発作業として完了扱いで、次タスクへ進めます。
{"id" => "9aded6b7-dac6-4cf8-920a-d263232a992d", "name" => "Takayuki Komoda"} (2026-07-12T22:57:52.575Z)¶
Draft PR を作成しました。
- PR: https://github.com/takataka328-max/EPAA/pull/106
- target:
develop - branch:
codex/tak-195-csv-import-surrogate-keys - commit:
06587fe
追加で実施した検証
-
start-verification-sample.cmd: 成功(5002 /epaa_verify_5002) -
generate-verification-report.ps1: 成功、settings report エラー 0 -
run-verification-matrix.ps1: 成功、passed=125 / failed=0 / skipped=0 -
run-verification-browser-smoke.ps1: 成功、代表画面スクリーンショット 7 枚作成 -
start-generated-sample.cmd: 成功(5001 /epaa)
Linear は Done にはせず、PRレビュー待ちとして扱います。
{"id" => "9aded6b7-dac6-4cf8-920a-d263232a992d", "name" => "Takayuki Komoda"} (2026-07-12T22:44:30.818Z)¶
実装・検証メモ
- DB内部主キー
idは手動作成・AIアシスト・Excel取込・CSV取込のいずれでも利用者入力にせず、生成アプリ側で自動採番する方針を Generator / GUI / manual に反映。 - Excel の単独
ID列はsource_id候補へ正規化し、ID・コード・番号系列には通常カラム扱いの警告を出すように変更。 - relation CSV import は
xxx_id__codeを参照先code_fieldで一括解決し、code_field -> id辞書を行ループ前に構築。行ごとの SELECT は廃止。 - integer
code_fieldは= ANY(@codes)、stringcode_fieldはlower(code_field) = ANY(@codes)でまとめて取得。重複コード時は旧実装のORDER BY id LIMIT 1に合わせて最小 id 優先。 - 追加検証:
tools/EPAA.Generator.Tests/verify-csv-import-surrogate-keys.ps1を追加し、生成コードがRETURNING "id"で採番 id を使い、relation resolve helper 内でExecuteScalarしないことを確認。
検証結果
-
verify-csv-import-surrogate-keys.ps1: 成功 -
verify-relation-multiple-joins.ps1: 成功 -
dotnet build .\tools\EPAA.Generator.Gui\EPAA.Generator.Gui.csproj: 成功 -
git diff --check: 成功 -
build-docs.ps1: 実行したがタイムアウト。対象のdocs/manuals/resource-yaml.htmlには追記反映済み。
{"id" => "9aded6b7-dac6-4cf8-920a-d263232a992d", "name" => "Takayuki Komoda"} (2026-07-12T22:07:19.011Z)¶
設計補足¶
この方針はExcel取込限定ではなく、EPAA生成アプリ全体の標準方針として扱う。
- 手動作成、AIアシスト、Excel取込、CSV取込のいずれでも、DB内部主キー
idはEPAA/DB側が自動採番する。 - ユーザーが業務上扱うID、コード、番号、外部システムID、Excel由来IDは通常カラムとして定義する。
- AIアシストは
idを業務項目として提案しない。仕様やExcelにID列がある場合はsource_id,external_id,xxx_codeなどの通常カラム候補として扱う。 - relationの内部保存値はDBサロゲートキー
xxx_id、CSVや外部入力での解決キーはxxx_id__code/code_fieldとする。
{"id" => "9aded6b7-dac6-4cf8-920a-d263232a992d", "name" => "Takayuki Komoda"} (2026-07-12T22:04:37.723Z)¶
設計チェックポイント案¶
採用方針¶
- DB内部主キー
idは全テーブルのサロゲートキーとして自動採番する。CSVではidを発行・指定しない。 - Excel由来の整数IDは、通常カラムとして保持する。例:
source_id,external_id,customer_source_id。 - 参照関係はCSV上の業務キー/元IDを
xxx_id__codeとして表現し、import時に参照先のcode_fieldからDB内部のxxx_idへ変換する。 -
code_fieldが整数型の場合も扱えるよう、生成器のCSV relation解決を型-awareにする。文字列は大小文字非依存、整数は数値parse後に等価比較する。
大量行対応¶
- 現行の行ごとSELECT方式は100万行級に不向きなため、relation解決では行単位SELECTを禁止する。
- import開始時にCSV内の distinct
xxx_id__codeを抽出し、参照先のcode_field -> idを一括取得してメモリ辞書で解決する。 - 参照キー数が多い場合はチャンク取得、将来の超大量取込では一時テーブルJOIN/COPY方式へ拡張できる境界にする。
- 親/参照先マスタを先にimportし、子/参照元テーブルを後続でimportする順序をTAK-192の前提仕様にする。
実装設計候補¶
-
tools/EPAA.Generator/Backend/BackendSourceWriter.cs- CSV import生成処理で、relation fieldごとの一括lookup辞書を作るコードを生成する。
-
Resolve...CsvCodeの行単位SELECTを、事前構築辞書の参照へ置き換える。 -
code_fieldの型に応じて文字列/整数比較を分ける。
-
tools/EPAA.Generator.Gui/Services/ExcelImportService.cs- ExcelのID/コード/番号系候補はDB主キーではなく通常フィールドとして扱う既存方針を明文化し、必要なら警告文を補強する。
-
adoc/manuals/resource-yaml.adoc- Excel整数IDはDB
idに投入しない、通常カラム/code_fieldとして扱う、relation解決は一括辞書/JOINで行う、という仕様を追記する。
- Excel整数IDはDB
- テスト
- 新規CSV importでDB
idがCSV不要で自動採番されること。 -
xxx_id__codeが参照先code_fieldから解決されること。 - 整数型
code_fieldでも参照解決できること。 - 生成コードに行単位SELECTが残らないこと、または一括lookup経路が使われること。
- 新規CSV importでDB
{"id" => "9aded6b7-dac6-4cf8-920a-d263232a992d", "name" => "Takayuki Komoda"} (2026-07-12T22:01:42.386Z)¶
要求整理メモ¶
CSV import / Excel整数IDの扱いは次の方針で進める。
- 生成アプリDBの内部主キー
idは、各テーブルで自動採番されるサロゲートキーとして扱う。 - CSV上ではDB主キー
idを発行・指定しない。CSVにはExcel由来ID、コード、番号などの業務キー/元データキーを保持する。 - Excel由来の整数IDは、DB主キーへ直接投入せず、通常カラムとして保持し、必要に応じて
code_fieldに使う。 - 複数テーブルのリレーションは、CSV上の
xxx_id__codeなどのキーをimport時にDB内部のxxx_idへ解決する。 - 100万行級を想定し、参照解決で行ごとのSELECTは禁止する。参照キーは一括取得、メモリ辞書、または一時テーブルJOINで解決する。
- 親/参照先マスタを先に取り込み、子/参照元テーブルを後続で取り込む順序を設計に含める。
RA Updated by Redmine Admin about 3 hours ago
- Parent task set to #83
RA Updated by Redmine Admin about 3 hours ago
- Status changed from New to Closed
Actions