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

Asp.net 如何在SQL数据库中创建和存储用户定义的自定义字段?,asp.net,database,field,user-defined-fields,Asp.net,Database,Field,User Defined Fields,我需要允许用户向记录中添加新字段,例如,如果有联系人记录,用户可能需要添加“SSN”数字字段和“生日”日期/日历字段。当然,他们会通过用户界面来实现这一点 然后,这些字段应可用于输入所有联系人记录 考虑到我的应用程序同时为许多用户运行(而不是单个公司部署等),并且理论上每个人都可以添加自己的自定义字段,在数据库中存储此信息的最佳做法是什么,特别是当需要搜索时?有一个存储字段名称和类型的表 field_ID INT field_name VARCHAR field_type ENU

我需要允许用户向记录中添加新字段,例如,如果有联系人记录,用户可能需要添加“SSN”数字字段和“生日”日期/日历字段。当然,他们会通过用户界面来实现这一点

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


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

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

field_ID     INT
field_name   VARCHAR
field_type   ENUM('int','float','text','richtext')
具有一个表,该表存储指向记录表中某个条目的链接、指向字段表中某个条目的链接以及字段值

fieldvalue_fieldID   INT
fieldvalue_recordID  INT
fieldvalue_value     BLOB

使其可搜索是另一个挑战-您需要从fieldvalue_值中获取任何可搜索的内容并对其进行索引。这将是特定于数据库的。在MySQL中,您可以将其设置为文本值,并在其上添加MySQL全文索引。

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

我们将在此处存储元信息,如Text1Att meta is
SSN;文本框;50;是的;虚假的;无效
字段的标题;控制类型;最大长度;是必填字段;是否需要定制验证;自定义验证消息
出生地;文本框;100;是的;是的;无效值
数字字段也一样。。。
日期元信息的
出生日期;日历控件;是的;是的;无效日期;
字段的标题;日历控件或其他控件;是必需的;是定制验证;自定义验证消息

在product表中要做的是添加相同数量的列,并使用数据类型text1Att,。。是varchar,num1Att有数字,date1Att有datetime,ID1Att有int

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


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

您的最佳选择是:

  • 允许用户通过上传模块或运行脚本来更改自己的数据库模式

  • 使用XML字段和支持索引和查询该字段内容的数据库


  • 这些是Martin Fowler在这里推荐的:

    坦率地说,我认为你在询问个别用户的需求是在自找麻烦。例如,如果你有10个人需要相同的信息,但用10种不同的方式来命名,那么你会有很多复杂的东西,但却没有什么好处。和用户见面并达成共识可能比临时做事情要好。你是100%正确的。但我仍然坚持这一要求:(我已经在许多应用程序中实现了这一点,当您实现此类需求时,这非常困难,但这将为用户添加自定义字段提供更大的灵活性。根据您的需求,这可能是最简单的方法。祝您好运。啊,是的,EAV反模式。更多信息,如果用于除了用户定义的自定义字段以外的任何内容。如果开发人员打算这样创建自己的数据库字段,那么这样做肯定是错误的,因为这样会不必要地使数据库更复杂、效率更低。这种技术适用于绝对需要用户能够创建自定义字段的情况在不改变数据库结构(即ALTER TABLE)的情况下使用IELD。尽管该解决方案看起来“丑陋”,但在可搜索性方面却要好得多。按照公认答案中描述的方式进行搜索会导致搜索许多字段的成本非常高(在性能方面)。