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

Ale*_*lex 5 database asp.net field user-defined-fields

我需要允许用户向记录添加新字段,例如,如果有联系人记录,用户可能想要添加"SSN"数字字段和"出生日期"日期/日历字段.他们当然会通过用户界面做到这一点.

然后,这些字段可用于所有联系人记录的输入.

考虑到我的应用程序同时为许多用户运行(不是单个公司部署等),理论上每个人都可以添加自己的自定义字段,将这些信息存储在数据库中的最佳做法是什么,尤其是当需要搜索时?

tho*_*ter 10

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

field_ID     INT
field_name   VARCHAR
field_type   ENUM('int','float','text','richtext')
Run Code Online (Sandbox Code Playgroud)

有一个表,用于存储记录表中条目的链接,字段表中条目的链接以及字段值.

fieldvalue_fieldID   INT
fieldvalue_recordID  INT
fieldvalue_value     BLOB
Run Code Online (Sandbox Code Playgroud)

使其可搜索是另一个挑战 - 您需要从该fieldvalue_value中获取任何可搜索的内容并将其编入索引.这将是特定于数据库的.在MySQL中,您可以将其设为TEXT值并在其上添加MySQL FULLTEXT索引.

  • 如果用于*user*-defined自定义字段以外的任何其他内容,则这是反模式.如果你是这样的,*开发人员*,将会创建自己的数据库字段,这绝对是错误的方法,因为你不必要地使你的数据库更复杂,效率更低.当您绝对需要用户能够创建自定义字段而不更改数据库结构(即ALTER TABLE)时,此技术适用于此类技术. (2认同)

Muh*_*tar 1

我们几乎在所有应用程序/产品中添加了附加属性/字段支持,以便为用户提供灵活性
就像我们有一个产品类别一样,在该类别中,客户可以定义任何产品的附加属性,
我们在数据库级别所做的是:
类别表有一些附加列,如: Text1Att、Text2Att...用于文本值支持,Num1Att、Num2Att...用于数字值支持,Date1Att、Date2Att...用于日期时间值支持,ID1Att、ID2Att...支持其他 ID像您可以添加下拉列表、列表框等表,...
这里所有列都有字符串数据类型。
我们在这里存储的是

我们将在这里存储元信息,例如 Text1Att 元是
SSN;textbox;50;true;false;Null;
字段标题;控件类型;最大长度;是必填字段;是需要自定义验证;自定义验证消息;
出生地;文本框;100;true;true;无效值;
数字字段相同...
日期元信息将类似于
出生日期;日历控件;true;true;无效日期;
字段标题;日历控件或者可以是其他;是必需的;是自定义验证;自定义验证消息;


在产品表中所做的是添加相同数量的列并具有数据类型text1Att,..是varchar,num1Att具有数字,date1Att具有日期时间,ID1Att具有int

我们在GUI方面所做的是:在类别定义页面中添加这些属性并在运行时构建元信息并将其存储在类别表中
另一方面,当我们在类别中定义产品时,元信息将从类别表中读取和遍历并填充到产品定义页面与其他字段一样。


如果您需要进一步的帮助,我可以为您提供图像,以便您更好地了解如何做到这一点。
我们正在经验和分析,这是一个非常灵活的方法

  • 尽管该解决方案看起来“丑陋”,但它在可搜索性方面要好得多。按照接受的答案中描述的方式进行操作会使搜索许多字段变得非常昂贵(就性能而言)。 (2认同)