我在数据库中有一些表。该表包含超过150列用于某些自定义字段操作,可能/可能不会被所有人使用。可以使用add column
动态创建它,而不是创建静态的150个未使用的列字段。
有人可以证明哪一个更好?何时使用动态,何时静态?为什么?
答案 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>>