您将如何在 SQL 数据库中创建和存储用户定义的自定义字段?
我需要允许用户向记录添加新字段,例如,如果有联系人记录,用户可能想要添加“SSN”数字字段和“出生日期”日期/日历字段。 当然,他们会通过用户界面来完成此操作。
这些字段应该可用于输入所有联系人记录。
考虑到我的应用程序同时为许多用户运行(不是单一公司部署等),并且理论上每个人都可以添加自己的自定义字段,将此信息存储在数据库中的最佳实践是什么,特别是当需要可搜索时?
I need to allow users to add new fields to a record, e.g. if there is a Contact record, a user may want to add a "SSN" numeric field and a "Birthdate" date/calendar field. They would do this through the UI of course.
Those fields should then be available for entry for all contact records.
Considering that my application runs for many users concurrently (not a single-company deployment etc.) and theoretically everyone could add their own custom fields, what would be the best practice to store this information in a database, especially when it needs to be searchable?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
有一个存储字段名称和类型的表。
拥有一个表,用于存储指向记录表中条目的链接、指向字段表中条目的链接以及字段值。
使其可搜索是另一个挑战 - 您需要从该 fieldvalue_value 中获取任何可搜索的内容并为其建立索引。 这将是特定于数据库的。 在 MySQL 中,您可以将其设为 TEXT 值并在其上添加 MySQL FULLTEXT 索引。
Have a table that stores the field names and types.
Have a table that stores a link to an entry in the record table, a link to an entry in the field table, and the field value.
Making it searchable is another challenge - you would need to grab any searchable content out of that fieldvalue_value and index that. This would be database-specific. In MySQL you could make that a TEXT value and add a MySQL FULLTEXT index on it.
我们几乎在所有应用程序/产品中添加了附加属性/字段支持,以便为用户提供灵活性
就像我们有一个产品类别,在该类别中,客户可以定义任何产品的附加属性
我们在DB层面所做的是:
类别表有一些附加列,例如:Text1Att,Text2Att...用于文本值支持,Num1Att,Num2Att...用于数字值支持,Date1Att,Date2Att...用于日期时间值支持,ID1Att,ID2Att...支持来自其他表的 ID,例如您可以添加下拉列表、列表框等
这里所有列都有字符串数据类型。
我们这里存储的是
我们将在这里存储元信息,例如 Text1Att 元信息是
SSN;文本框;50;真;假;空;
字段标题;控件类型;最大长度;是必填字段;是需要自定义验证; 自定义验证消息;
出生地;文本框;100;true;true;无效值;
数字字段相同...
日期元信息看起来像
出生日期;日历控件;true;true;无效日期;
字段标题; 日历控件或者可以是其他;是必需的;是自定义验证; 自定义验证消息;
在产品表中所做的是添加相同数量的列并具有数据类型text1Att,..是varchar,num1Att具有数字,date1Att具有日期时间,ID1Att具有int
我们在GUI方面正在做的是:在类别定义页面中添加这些属性并构建运行时的元信息并存储在类别表中
另一方面,当我们在类别中定义产品时,元信息将从类别表中读取和遍历,并像其他字段一样填充到产品定义页面中。
如果您需要进一步的帮助,我可以为您提供图像,以便您更好地了解如何做到这一点。
我们是经验和分析,这是非常灵活的方法
We add almost in our all application/products additional attribute/field support for given flexibility to user
Like we have a product category, In the category, customer can define additional attribute of any product
what we are doing in the DB level is:
Category Table have some additional column like: Text1Att, Text2Att...for text value support, Num1Att, Num2Att... for Number value support, Date1Att, Date2Att... for datetime value support, ID1Att, ID2Att... support for ID from other table like you can add dropdown, listbox,...
here all the column have String datatype.
what we store here is
we will store meta information here, like for Text1Att meta is
SSN;textbox;50;true;false;Null;
Caption of field;Control Type;Max length;is Required field;is Custom validation required; Custom Validation message;
birth place;textbox;100;true;true;Invalid Value;
Same for Numeric field ...
for date meta information will look like
birth date;Calendar control;true;true;Invalid Date;
Caption of field; Calendar control or can be other;is required;is Custom Validation; Custom Validation message;
What are doing in product table is add same number of column and have datatype text1Att,.. is varchar, num1Att have numeric, date1Att have datetime, ID1Att have int
What we are doing GUI side is : In category definition page add these attribute and build meta information at runtime and store in category table
On the other hand when we define product in category, meta information will be read and traverse from category table and populate in product definition page like other fields.
if u need further help, I can provide you images so that you will better understand how can be done this.
we are experience and analyze, this is much flexible approach
最好的选择是:
允许用户更改自己的数据库架构,可能是通过上传模块或运行脚本。
使用 XML 字段以及支持索引和查询该字段内容的数据库
这些是 Martin 推荐的福勒,在这里:http://martinfowler.com/bliki/UserDefinedField.html
Your best options are:
Allow the user to alter their own database schema, perhaps by uploading a module or running a script.
Use an XML field, and a database that supports indexes and querying on the contents of that field
These are recommended by Martin Fowler, here: http://martinfowler.com/bliki/UserDefinedField.html