2011-03-02 32 views
0

這個問題是很多有關如何做,想法等處理與增長和收縮

我有一種情況,用戶可以創建多個自定義字段,因爲他可以Number類型的,文本的可能性定製用戶領域,或日期,並用它來製作表格。我必須設計/設計一些可處理和存儲值的表模型,以便一旦保存就可以對這些值進行查詢。

以前我已經硬編碼了25個用戶定義字段(UDF)的格式。如果用戶使用任何字段,我會創建一個包含10 Number,10 Text和5 Date類型的25列的表格,並在其中存儲標籤。然後將其映射到具有相同格式並存儲該值的其他表。映射是爲了知道哪個字段有什麼標籤,但這不是一種有效的方式,我希望。

任何建議,將不勝感激。

用戶有權創建任意數量的上述類型的UDF。那麼它可以用來再次製作表單,這也是N個數字,並且必須保存每個表單類型的數據。

例如比方說,一個用戶創建了10個10號日期和10個文本字段,前5個用於製作form1,全部10個用於使form2現在保存數據。

我的在其上的想法:

請與表1 [ID,名稱(如UDF_xxx其中xxx是數據類型),編號userLabel]

表2來映射的形式和表1 [ID(f_key table1_id), F_id(表單ID)]

並將每個數據類型的1個表格設置爲[id(表格1的f_key),F_id(表格編號),R_id(數據的行ID,對於所有數據類型都是相同的) ]

感謝所有我要實現的,它既DataSet條目和json方法看起來不錯因爲它提供了更廣泛的擴展能力。我仍然要弄清楚哪一種最適合現有的格式。

回答

1

創建一個表來管理哪些字段存在。然後爲您想要支持的每種數據類型創建表格,其中用戶將其值存入。

create table Fields(
    fieldid int not null, 
    fieldname text not null, 
    fieldtype int not null 
); 

create table FieldDate 
(
    ValueId int not null, 
    fieldid int not null, 
    value date 
); 

create table FieldNumber 
(
    ValueId int not null, 
    fieldid int not null, 
    value number 
); 

.. 

另一種可能性是使用ALTER TABLE創建自定義字段。如果您的應用程序有權執行此命令,並且自定義字段很少發生更改,這將是我選擇的選項。

+0

謝謝,請再次閱讀我的問題我已更新它。抱歉,起初我無法理解解決方案。 – rain 2011-03-02 12:28:23

2

你想實現什麼? 每個表格排列的表格還是每個數據集可能包含不同的集合?

兩種可能性浮現在我的腦海裏:

  1. 創建描述數據集的一個字段的表,即密鑰可能是數據集的id + id字段和其他列可能包含存儲爲一個字符串值以及該值的類型(即數字,字符串,布爾等)。

    這樣,每個數據集可能會不同,但是在讀取數據集並將其存儲到對象中時,您可以創建適當的值類型(Integer,Double,String,Boolean等)。)

  2. 使用一些naimg約定爲每個表單創建一個表。當表單佈局更改時,執行ALTER TABLE語句以添加,刪除,重命名列或更改其類型。 當用戶更改列的類型或將其刪除時,可能需要否認這些值是否爲空,或者至少詢問用戶是否願意刪除與新需求不匹配的值。


編輯:示例方法1

表UDF ​​//描述了可用的字段
--------
ID(PK)
USER_ID(FK)
類型
名稱

表格// //描述表格的一般屬性
--------
ID(PK)
USER_ID(FK)
名稱
描述

表FORM_LAYOUT //描述了一種形式的字段佈局
--------
form_id(FK)
udf_id(FK)等列索引,表單字段名稱等
映射//映射信息

表DATASET_ENTRY //描述一個ENTR一個數據集的Y,即,一個UDF在
--------
ID(PK)值
ROW_ID
form_id(FK)
udf_id(FK)



選擇特定形式的內容然後可以做這樣的:
SELECT e.value, f.type, l.mapping from DATASET_ENTRY e
JOIN UDF f ON e.udf_id = f.id
JOIN FORM_LAYOUT l ON e.form_id = l.form_id AND e.udf_id = l.udf_id
WHERE e.row_id = ? AND e.form_id = ?

+0

請再次閱讀我的問題我已更新它。抱歉,起初我無法理解解決方案。謝謝 – rain 2011-03-02 12:27:35

+0

謝謝現在很清楚。非常感謝:) – rain 2011-03-03 03:55:42

2

有我用兩種方法。

  1. XML:要創建一個動態的用戶屬性,你可以使用XML。這個XML將被存儲在clob列中 - 例如,user_attributes。將整個用戶數據存儲在XML鍵值對中,其中type爲屬性或另一個字段。這會給你最大的自由。

    您可以使用XOM或任何其他XML對象模型API來顯示或操作數據。一個典型的節點會像

    <userdata> 
        ... 
        ... 
        <datanode> 
        <key type="Date">User Birth</key> 
        <value>1994-02-25</value> 
        </datanode> 
        ... 
    </userdata> 
    
  2. 屬性的AttributeValue這是上面一樣,但使用表同樣的事情。你所做的是你創建一個表 - attributes與FK作爲user_id,另一個表attribute_values與FK作爲attribute_id

    attributes包含多個字段名稱和類型,每個userattribute_values包含values這些屬性。所以基本上,

    users 
        user_id 
    
    attributes 
        attr_id 
        user_id (FK) 
        attr_type 
        attr_name 
    
    attribute_values 
        attr_val_id 
        attr_id (FK) 
        attr_val 
    

如果你看到兩個走近你是不是受了一對多,或者你有什麼類型的數據限制。但是這是解析的一個缺點。在任何一種情況下,您都必須進行少量處理才能顯示或分析數據。 (具有剛性列結構vs具有完全動態數據)的方法最好的方法是創建一個users表,其中包含必須具有的列(如user_name,年齡,性別,地址等),並具有用戶創建的數據(喜歡最喜歡的寵物屋等)以XML或屬性attribute_value。

+0

感謝您的回覆,我曾經想過使用Json,但直接查詢用戶數據是不可能的,所以我放棄它可能是我錯過了一些東西。 – rain 2011-03-02 12:26:21

+0

@rain你可以在第二種情況下搜索user_data。假設你正在爲用戶提供一個關於「寵物商店」的問題,他提到了「小鴨家」,你可以通過'...輕鬆搜索,其中attributes.attr_name就像'%pet house%'和attribute_values ='小鴨回家' 「搜索能力可能是XML方法中的一個問題。但這可以解決。 – Nishant 2011-03-02 12:34:18