Sealyu 2010-3-18
在項目中經常會碰到這樣的問題: 用戶要求他們的產品等實體的屬性是可定制的。比如:產品的數量、高度、重量等屬性,都是可以在后臺增刪該查的。在這種情況下,使用java建立實體就遇到問題了,因為數據庫中的字段是不定的。 這種情況在一些單據、試卷等地方是很常見的。
1。目前為止,沒有發現比較完美的解決方法。 之前項目中遇到了一次動態生成單據的情況,主要是通過使用幾張表來存儲表的結構和字段信息來實現。 這種情況下,實現查詢和報表等功能時就會受到影響。 具體方法跟下面這位的類似:
我在給一家打字公司開發一個將表單的內容輸入數據庫的程序。表單中可能有簡單的送貨收據(20多個字段),可能有民意調查的表格(50多個字段),可能有保險公司的用戶登記表(100多個字段)。討厭的是這樣的表單可能又幾百種。
我設計的數據庫如下:
表單的種類表(表1):
Form_ID //表單的種類ID
Form_Name //表單的名稱
某一個表單的字段表(表2)
Field_ID //字段的ID
Field_Name //字段的名稱
Form_ID //表單的種類ID,與表1連接
具體的某一個表單表(表3)
Sheet_ID //具體的某一個表單的ID
Client_ID //這個表單所屬的客戶ID,與客戶表連接
某一個表單的字段內容表(表4)
Field_Value_ID //字段的內容ID
Field_Value //字段的內容
Field_ID //字段的ID,與表2連接
Sheet_ID //具體的某一個表單的ID,與表3連接
每增加了一種新的表單時,在表1和表2中添加如下記錄:
表1:Form_ID Form_Name
A001 送貨單
表2:Field_ID Field_Name Form_ID
f0001 發貨日期 A001
f0002 發貨人 A001
f0003 收貨人地址 A001
這樣,當某一個打字公司的客戶要求輸入這個“送貨單”時,每輸入一個送貨單(即表單表3),表3和表4添加如下記錄:(每輸入一個送貨單之類的表單,表3和表4都添加數據)
表3:Sheet_ID Client_ID
S001 0000001
表4:Field_Value_ID Field_Value Field_ID Sheet_ID
V0001 2001.5.8 f0001 S001
V0002 張三 f0002 S001
V0003 大連市西崗區 f0003 S001
打字公司根據具體的某一個表單的ID(Sheet_ID),結合4個表提取客戶ID、表單種類名稱、字段名稱和字段內容存入另外的數據庫。
2。還看到過一種情況,是只用一個長字符串字段,利用xml的格式來存儲對應的結構,同時在java中使用xml2db等工具來解析。這種情況下,查詢和報表功能同樣不好實現。同時,xml節點的增刪該查也不太方便。
3。最后一種方法,是直接使用數據庫來實現。前幾天看到DB2 9中已經支持對XML格式數據的存儲和查詢。使用XQUERY來配套實現查詢。不過這種方法對數據庫的依賴性強,目前為止,還沒發現有其他數據庫提供這種功能。