我需要允许用户在记录中添加新字段,例如如果存在联系人记录,则用户可能想要添加“SSN”数字字段和“出生日期”日期/日历字段。他们当然会通过用户界面做到这一点。
然后,这些字段可用于输入所有联系人记录。
考虑到我的应用程序同时为许多用户运行(不是单个公司部署等),理论上每个人都可以添加自己的自定义字段,将这些信息存储在数据库中的最佳做法是什么,特别是在需要时可以搜索?
答案 0 :(得分:10)
有一个存储字段名称和类型的表。
field_ID INT
field_name VARCHAR
field_type ENUM('int','float','text','richtext')
有一个表,用于存储记录表中条目的链接,字段表中条目的链接以及字段值。
fieldvalue_fieldID INT
fieldvalue_recordID INT
fieldvalue_value BLOB
使其可搜索是另一项挑战 - 您需要从该fieldvalue_value中获取任何可搜索的内容并将其编入索引。这将是特定于数据库的。在MySQL中,您可以将其设为TEXT值并在其上添加MySQL FULLTEXT索引。
答案 1 :(得分:1)
我们在所有应用程序/产品中添加了额外的属性/字段支持,以便为用户提供灵活性
就像我们有产品类别一样,在类别中,客户可以定义任何产品的附加属性
我们在数据库级别做的是:
类别表有一些额外的列,如:Text1Att,Text2Att ...用于文本值支持,Num1Att,Num2Att ...用于数值支持,Date1Att,Date2Att ...用于日期时间值支持,ID1Att,ID2Att .. 。支持来自其他表的ID,比如你可以添加下拉列表,列表框,...
这里所有列都有String数据类型。
我们在这里存储的是什么
我们将在这里存储元信息,就像Text1Att meta一样
的 SSN;文本框; 50;真假; NULL; 强>
字段标题;控制类型;最大长度;是必填字段;是否需要自定义验证;自定义验证消息;
出生地;文本框; 100;真;真;无效值;
相同的数字字段......
对于日期元信息将看起来像
出生日期;日历控件; true; true;无效日期;
字段说明;日历控件或可以是其他;是必需的;是自定义验证;自定义验证消息;
在产品表中做的是添加相同数量的列并且具有数据类型text1Att,..是varchar,num1Att有数字,date1Att有datetime,ID1Att有int
我们在GUI方面做的是:在类别定义页面中添加这些属性并在运行时构建元信息并存储在类别表中
另一方面,当我们在类别中定义产品时,元信息将从类别表中读取和遍历,并像其他字段一样填充在产品定义页面中。
如果您需要进一步的帮助,我可以为您提供图像,以便您更好地了解如何做到这一点。
我们是经验和分析,这是一种非常灵活的方法
答案 2 :(得分:1)
您最好的选择是:
允许用户更改自己的数据库架构,可能是通过上传模块或运行脚本。
使用XML字段,以及支持索引和查询该字段内容的数据库
Martin Fowler推荐这些:http://martinfowler.com/bliki/UserDefinedField.html