UDT 以三張表支撐無限欄位動態表單,結構極度精簡:UserDefinedFields(結構定義)、UserDefinedRows(主鍵)、UserDefinedData(明細值,FieldValue 用 ntext)。同樣設計見於 DNN TabModuleSettings(用 nvarchar(2000))。
表單:姓名、性別、年齡。資料:張三、男、25。資料庫實際存儲:
RowID=2FieldID=10/11/12 對應姓名/性別/年齡,FieldValue 存對應值。SELECT R.UserDefinedRowID,
D1.FieldValue As 姓名,
D2.FieldValue As 性別,
D3.FieldValue As 年齡
FROM UserDefinedRows R
LEFT JOIN UserDefinedData D1 ON R.UserDefinedRowID=D1.UserDefinedRowID AND D1.UserDefinedFieldID=10
LEFT JOIN UserDefinedData D2 ON R.UserDefinedRowID=D2.UserDefinedRowID AND D2.UserDefinedFieldID=11
LEFT JOIN UserDefinedData D3 ON R.UserDefinedRowID=D3.UserDefinedRowID AND D3.UserDefinedFieldID=12
WHERE R.UserDefinedRowID=2
30 欄位即 30 個 JOIN,SQL 極長、效能極差。UDT 實際採「逐筆讀取→記憶體動態建 DataTable」方式,更慢。團隊負責人承認不適合大量資料——這是結構性問題。
要支援百萬級資料,必須重構:保留動態擴充優勢,消除 JOIN 與記憶體組裝。下文將詳細介紹優化方案。