我需要允许用户向记录添加新字段,例如,如果有联系人记录,用户可能希望添加“SSN”数字字段和“出生日期”日期/日历字段。他们当然会通过 UI 来做到这一点。
然后,这些字段应可用于输入所有联系人记录。
考虑到我的应用程序同时为许多用户运行(不是单一公司部署等),理论上每个人都可以添加自己的自定义字段,将这些信息存储在数据库中的最佳实践是什么,尤其是当它需要可搜索时?
我需要允许用户向记录添加新字段,例如,如果有联系人记录,用户可能希望添加“SSN”数字字段和“出生日期”日期/日历字段。他们当然会通过 UI 来做到这一点。
然后,这些字段应可用于输入所有联系人记录。
考虑到我的应用程序同时为许多用户运行(不是单一公司部署等),理论上每个人都可以添加自己的自定义字段,将这些信息存储在数据库中的最佳实践是什么,尤其是当它需要可搜索时?
有一个存储字段名称和类型的表。
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 索引。
我们几乎在所有应用程序/产品中添加了附加属性/字段支持,以便为用户提供灵活性
就像我们有一个产品类别一样,在类别中,客户可以定义任何产品的附加属性,
我们在数据库级别所做的是:
类别表有一些额外的列,如:Text1Att、Text2Att...用于文本值支持、Num1Att、Num2Att...用于数字值支持、Date1Att、Date2Att...用于日期时间值支持、ID1Att、ID2Att...支持其他 ID像您这样的表可以添加下拉列表、列表框......
这里所有的列都有字符串数据类型。
我们在这里存储的是
我们将在此处存储元信息,例如 Text1Att 元是
SSN;textbox;50;true;false;Null;
字段标题;控件类型;最大长度;是必填字段;是否需要自定义验证;自定义验证消息;
出生地;文本框;100;真;真;无效值;
数字字段相同...
日期元信息看起来像
出生日期;日历控制;真;真;无效日期;
字段标题;日历控件或可以是其他;是必需的;是自定义验证;自定义验证消息;
在产品表中所做的是添加相同数量的列并具有数据类型 text1Att,.. 是 varchar,num1Att 有数字,date1Att 有日期时间,ID1Att 有 int
我们在GUI端做的是:在类别定义页面中添加这些属性并在运行时构建元信息并存储在类别表
中另一方面,当我们在类别中定义产品时,将从类别表中读取并遍历元信息并填充到产品定义页面与其他字段一样。
如果您需要进一步的帮助,我可以为您提供图片,以便您更好地了解如何做到这一点。
我们是经验和分析,这是非常灵活的方法
您的最佳选择是:
允许用户更改自己的数据库模式,可能通过上传模块或运行脚本。
使用 XML 字段和支持索引和查询该字段内容的数据库
这些是 Martin Fowler 推荐的,在这里:http ://martinfowler.com/bliki/UserDefinedField.html