2012-05-23 33 views
0

我正在爲我的應用程序構建自定義字段功能。這使得管理員可以添加自定義配置文件字段,供用戶根據網站的需要進行填寫。爲自定義字段動態添加新列

的模式很簡單

field_meta (store some metadata about the field) 
================================================ 
id 
type //type of field 
field_name //name of the field in the fields table 
render_data //Some data to use when rendering the form field 

field 
=================== 
id 
name //Default field that can't be deleted 
address //Default field that can't be deleted 
customfield_1 
customfield_2 

field_meta表用於存儲一些元數據字段,這樣我們就可以呈現表單字段。

然後將每個字段存儲在field表中的新列中。

問題: 爲了便於使用,並且不必處理選擇保留字或使用非英語單詞作爲列名的用戶,我不會要求用戶爲列名選擇名稱。

我目前正在考慮通過字段類型調用列名稱(應用程序(電子郵件,網站,文本,段落文本等)中有相當多的類型,僅舉幾例)並添加一個數字。一些例子:

  • EMAIL_1
  • _1
  • _2
  • Text_3
  • EMAIL_2

但是,這種方法的問題是,它需要一個公平的位的工作來拿出專欄名稱。我需要獲取所有列,選擇與我創建的列類型相同的列,解析最大的數字,然後創建列。

有沒有更好的策略來做到這一點?或者也許是一種完全不同的方式來命名消除這些問題的列?

回答

0

我決定去與我原來的做法,那就是基本上建立一個列的名稱,包括類型和數量增多:

  • EMAIL_1
  • _1
  • _2
  • Text_3

儘管生成名稱需要花費一點努力,但只有在創建配置文件時纔會執行此操作因此,只有在這段時間內纔會出現性能問題。

0

不要嘗試動態添加列,這是一個緩慢(而不是很好的形式)的方法。

而是將額外的列存儲在一個新表中,每個表都有自己的ID。然後有另一個表存儲用戶ID,額外的列ID和該用戶的屬性信息。這可能會模仿添加新列而實際上不需要這樣做。

編輯: 事實上,它聽起來像EAV。架構:
屬性{ID:INT,名稱:字符串}
用戶{ID:INT,名稱:字符串,(其他任何需要的...)}
Users_attributes {Attribute_id:INT,USER_ID:INT,Attribute_info:字符串}

然後,只需使用相應的User_id和Attribute_id將任何新屬性輸入到屬性(具有遞增ID)以及任何新用戶信息到User_attributes中。

+0

您能否提供一個示例模式?這聽起來有點像EAV。 – F21