我正在尝试找到一个指导我的基于用户的自定义字段如何工作的教程。就像在调查网站中一样,他们让用户创建自定义字段并存储它们,更重要的是存储通过这些字段输入的数据。
我正在寻找描述如何在数据库上完成此操作的内容。一旦用户将其提取到excel / cvs文件,我找到一种不会永远检索此数据的方法有点麻烦。
答案 0 :(得分:3)
Entity-Attribute-Value model通常用于在关系数据库中处理此场景。快速搜索“EAV模型”将产生比您知道如何处理的更多信息。
答案 1 :(得分:3)
第六范式是实现这一目标的正式方式。对于所有表,使用3NF,对于需要在没有DDL更改的情况下添加列的一个或两个表,使用6NF。谨慎使用。
EAV是6NF的私生子。这意味着,做这件事并写下它的人,对6NF没有正式的理解,所以经常创造怪物。当然,您必须保持良好的标准:使用数据类型;声明性参照完整性(外键);等等。不要让那些人获得任何东西。远离那些告诉你必须放弃他们的人,就像地狱一样。
<6> 6NF / EAV非常快,使用服务器的设置处理能力没有任何障碍。再一次,远离那些告诉你必须使用逐行处理或游标或者你不能轻易地从行构建列的人。如果您遇到特定问题,请再次发布。这需要超越SQL的当前功能(控件,DDL);为了以受控的方式做到这一点并避免创建不可维护的怪物,你需要一个小目录来包含元数据。如果你聪明,你可以使用它生成查询的reruired,从而消除了很多其他的手工劳动。
周围有很多错误信息,有些“rep”的人是无能为力的。为了在技术上取得成功,我们需要准确的信息,而不是神话和恐惧贩卖。您可能对我最近试过set the recond straight的帖子感兴趣。
答案 2 :(得分:0)
我们在每个表中使用3个表,我们需要支持用户定义的字段。 因此,例如,如果要将其应用于SURVEY表,则可以创建:
SURVEY_ATTRIBUTE
- SurveyAttributeId
- SurveyAttributeName
- SurveyAttributeType
SURVEY_ATTRIBUTE_CHOICE
- SurveyAttributeChoiceId
- SurveyAttributeChoice
- SurveyAttributeId
SURVEY_ATTRIBUTE_VALUE
- SurveyAttributeValueId
- SurveyId
- SurveyAttributeValue
SURVEY_ATTRIBUTE表为每个自定义属性存储一条记录。 SURVEY_ATTRIBUTE_VALUE表存储实际分配给调查的属性。因此,如果属性不适用于servey,则不存储任何内容。 SURVEY_ATTRIBUTE_CHOICE表存储“LIST”类型属性的所有允许选择。
SURVEY_ATTRIBUTE表中的SurveyAttributeType字段用于描述属性的类型。我们只使用少量允许类型,如CHAR,DATE,NUMBER,LIST。根据该值,我们的应用程序知道如何处理SurveyAttributeValue字段中存储的值。你当然可以将其进一步形式化,以允许更宽的范围,指定最大场长等......,这一切都取决于你希望给最终用户的自由度。我们尽量让它尽可能简单,因为我们的目标受众不是数据库管理员,而是最终用户,他们通常不关心字段长度等。
您也可以选择跳过SURVEY_ATTRIBUTE_CHOICE表,并将允许的值存储在SURVEY_ATTRIBUTE字段中的XML字符串中。这取决于您在应用程序中实现的方式。