您将如何在 SQL 数据库中创建和存储用户定义的自定义字段?

发布于 2024-07-22 14:26:34 字数 213 浏览 7 评论 0原文

我需要允许用户向记录添加新字段,例如,如果有联系人记录,用户可能想要添加“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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

凤舞天涯 2024-07-29 14:26:34

有一个存储字段名称和类型的表。

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 索引。

Have a table that stores the field names and types.

field_ID     INT
field_name   VARCHAR
field_type   ENUM('int','float','text','richtext')

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.

fieldvalue_fieldID   INT
fieldvalue_recordID  INT
fieldvalue_value     BLOB

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

若能看破又如何 2024-07-29 14:26:34

最好的选择是:

  1. 允许用户更改自己的数据库架构,可能是通过上传模块或运行脚本。

  2. 使用 XML 字段以及支持索引和查询该字段内容的数据库

这些是 Martin 推荐的福勒,在这里:http://martinfowler.com/bliki/UserDefinedField.html

Your best options are:

  1. Allow the user to alter their own database schema, perhaps by uploading a module or running a script.

  2. 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文