动态还是静态列?

时间:2014-12-18 06:00:30

标签: mysql ruby-on-rails

我在数据库中有一些表。该表包含超过150列用于某些自定义字段操作,可能/可能不会被所有人使用。可以使用add column动态创建它,而不是创建静态的150个未使用的列字段。

有人可以证明哪一个更好?何时使用动态,何时静态?为什么?

1 个答案:

答案 0 :(得分:0)

您可以查找以下规范化以维护自定义字段,我已成功用于多个Web /窗口应用程序。

<强> FormMasterTable

FormId, Name: this will be identifier and will be passed from Form to DB query to identify itself

datatypeMaster表

datatypeId, datatypeName 

abobe将定义您要支持的所有自定义字段,即客户可以创建以自定义表单。

表格 - 客户 - CustomFieldMapping 表示自定义字段主表,用于管理列定义和与客户的映射。

customerId, FormName/FormId,    FieldName,  customFieldId,  datatypeId(FK:datatypeMaster), length ....

下一步是创建所有表来存储datatypeMaster表中定义的所有数据类型,即每个数据类型的一个表,我能想到的一些例子......

自定义字段详细信息表格,用于表示CustomNumberFields

customFieldId FieldValue(numeric(max))

字符串的自定义字段详细信息表格说CustomTextFields

customFieldId FieldValue(varchar(max))

日期的自定义字段详细信息表格说明CustomDateFields

customFieldId FieldValue(datetime)

依旧......

现在,您可以使用内部联接的所有一个查询来获取客户的所有自定义列。

获取自定义字段字段的示例查询

select MP.FieldName, CFN.FieldValue from Form-Customer-CustomFieldMapping MP
JOIN CustomNumberFields CFN on MP.CustomFieldId and CFN.CustomFieldId where formId=<<paramformId>> and customerId=<<paramcustomerId>>                   
UNION 
    select MP.FieldName, CFN.FieldValue from  Form-Customer-CustomFieldMapping MP                           
JOIN CustomTextFields CFN on MP.CustomFieldId and CFN.CustomFieldId where formId=<<paramformId>>                    and customerId=<<paramcustomerId>>  

UNION

select MP.FieldName, CFN.FieldValue from Form-Customer-CustomFieldMapping MP 
JOIN CustomDateFields CFN on MP.CustomFieldId and CFN.CustomFieldId where formId=<<paramformId>>    and     customerId=<<paramcustomerId>>