【问题标题】:How would you create and store user-defined custom fields in a SQL database?您将如何在 SQL 数据库中创建和存储用户定义的自定义字段?
【发布时间】:2010-10-31 23:11:31
【问题描述】:

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

这些字段随后应可供所有联系人记录输入。

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

【问题讨论】:

  • 坦率地说,我认为您通过即时询问个人用户的需求是在自找麻烦。例如,如果您有 10 个人需要相同的信息,但有 10 种不同的命名方式,那么您将有很多复杂性,但收益却很少。与用户会面并达成共识可能比临时做事更好。
  • 你是 100% 正确的。我仍然坚持这个要求:(
  • 我在很多应用程序中都做到了这一点,当你实现这种类型的需求时,它非常困难,但这会给用户更多的灵活性来添加自定义字段

标签: asp.net database field user-defined-fields


【解决方案1】:

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

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

【讨论】:

  • 鉴于您的要求,这可能是最直接的处理方式。祝你好运。
  • 啊,是的,EAV 反模式。
  • 更多信息herehere
  • 如果用于除 user 定义的自定义字段以外的任何内容,这是一种反模式。如果这就是您,开发人员,将要创建自己的数据库字段的方式,那么这绝对是错误的做法,因为您将不必要地使您的数据库更加复杂和低效。当您绝对需要您的用户能够在不改变数据库结构(即 ALTER TABLE)的情况下创建自定义字段时,此技术适用。
【解决方案2】:

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

我们将在这里存储元信息,例如 Text1Att 元是
SSN;文本框;50;真;假;空;
字段标题;控件类型;最大长度;是必填字段;是否需要自定义验证;自定义验证消息;
出生地;文本框;100;true;true;无效值;
数字字段也是如此...
日期元信息看起来像
生日;日历控制;true;true;无效日期;
字段标题;日历控件或可以是其他;是必需的;是自定义验证;自定义验证消息;


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

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


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

【讨论】:

  • 虽然该解决方案看起来“丑陋”,但在可搜索性方面要好得多。按照公认答案中描述的方式进行操作会导致搜索许多字段的成本非常高(在性能方面)。
【解决方案3】:

您最好的选择是:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多