用于用户设计表单的数据存储区 - NoSQL for EAV的任何优点

ril*_*ley 4 mongodb dynamic-forms nosql entity-attribute-value

我需要在我的软件中通过Web界面允许用户设计的表单创建.即,他们创建一个问题,类型(文本,广播,复选框等),选项(如果需要)(无线电/支票),然后添加,并继续在此过程中,直到他们在表单中创建所有字段.

除了查看/填写/打印它们之外,不会对它们进行任何查询,即它们添加可以无限次填写的"问卷"(有些可能是20次,数百万次).

经过一些研究后,似乎EAV类型的解决方案听起来不错,除了那里有很多负面看法.很多人建议在这种情况下使用NoSQL数据库,但我并没有真正看到它们的优点 - 你仍然拥有一个包含许多字段的表单,然后是许多字段的结果.

某些字段(text/text_area/date)会有一个可能的值,但许多字段也有多个选项(单选按钮,选择下拉菜单,复选框).

这是传统SQL中的示例设计:

form:creator_id,name

form_field:form_id,order,question,type(text,text_area,date,radio,select,check)

form_field_option:form_field_id,名称,值,顺序(用于收音机/选择/检查)

form_result:form_id,application_id(不是我使用的名称,但所有结果都属于'应用程序')

form_field_value:form_result_id,form_field_id,form_field_option_id,value(如果选项字段的值为空,则text_field_option_id的文本字段为空)

基于此构建表单并获得结果似乎相当容易.它可能或可能不完全有效但是说一个典型的形式是5-30个问题,那会不会很糟糕?

把它放在NoSQL数据库中是否有任何优势,即Mongo或类似的东西?如果是这样,你能给我具体的例子,给我一个样本设计吗?我已经看到很多答案,比如'NoSQL更适合这个',但我没有这方面的经验,是因为更快的检索结果,还是什么?使用NoSQL会有什么缺点?

谢谢

小智 9

MongoDB可能比关系数据库更适合这个应用程序.您的基本实体,表单设计和表单结果是有效的文档,其内容本质上绑定在一起,即表单字段在其父表单的上下文之外没有多大意义.

MongoDB允许您将这些文档作为单个结构存储,而不是像关系数据模型那样分散在各个表中.

这是YAML,因为它比JSON更清晰.底层结构将是相同的.

_id: 12345
creator: Adrian
name: NoSQL form demonstrator

fields:
  - id: first_name
    label: First name
    type: text
    required: true

  - id: last_name
    label: Last name
    type: text
    required: true

  - id: dob
    label: Date of birth
    type: date

  - id: bio
    label: Biography
    type: textarea

  - id: drink
    label: What would you like to drink?
    type: select
    options:
      - id: tea
        label: Tea
      - id: coffee
        label: Coffee
      - id: beer
        label: Beer
      - id: water
        label: Mineral water

    - id: mailing_list
      label: Join our mailing list?
      type: check
      default: false
Run Code Online (Sandbox Code Playgroud)

注意:

您只需将密钥存储在需要的位置,而不是像在关系数据库中那样为每个上下文中的每个东西都添加一列.例如,没有必要required: false- 如果这是默认值,那么就把它留下来.

MongoDB文档具有内在顺序,因此无需创建字段来保存表单设计中的字段顺序.

表单结果将以相同的方式存储.只需按照您的预期自然存储它们:

_id: 545245
form_id: 12345
name: NoSQL form demonstrator

results:
  - id: first_name
    label: First name
    type: text
    value: Adrian

  - id: last_name
    label: Last name
    type: text
    value: Short

  - id: dob
    label: Date of birth
    type: date
    value: 1970-01-01

  - id: bio
    label: Biography
    type: textarea
    value: Doing things on the internet

  - id: drink
    label: What would you like to drink?
    type: select
    value: Tea

  - id: mailing_list
    label: Join our mailing list?
    type: check
    value: false
Run Code Online (Sandbox Code Playgroud)