2006 年底曾與 UDT 作者 Sebastian Leupold 郵件討論資料結構,覺得原設計難懂,建議優化未果,決定自行重構。以下分析 UDT 原結構與優化思路。
ModuleId 與 UserDefinedRowID 兩欄,極度稀疏。FieldValue 統一用 ntext)。讀取單筆橫向資料需多重 LEFT JOIN,30 欄位即需 30 次 JOIN,效率極低。UDT 實際採「逐筆讀取→記憶體動態建 DataTable→綁定」方式,更慢。作者亦承認不適合大量資料。
UserDefinedRows(從 2 欄擴至數十欄),嚴格定型(int、datetime 等),避免字串儲存導致查詢轉型錯誤。UserDefinedData,維持動態無限擴充能力。查詢列表時只需:SELECT UserDefinedID, Field1 AS 姓名, Field2 AS 性別 FROM UserDefinedRows,無 JOIN、無記憶體組裝,效率大增。編輯/明細時再讀取擴充表。
UserDefinedFields 新增欄位標記「基本/擴充」,使用者定義表單時引導:列表/查詢用欄位選基本,其餘選擴充。
此重構保留動態表單靈活性,大幅提升列表查詢效能,為百萬級資料奠基。下文將解決動態更新的技術難題。