gpt4 book ai didi

mongodb - 用于用户设计表单的数据存储 - NoSQL 对 EAV 的任何优势

转载 作者:可可西里 更新时间:2023-11-01 09:09:07 31 4
gpt4 key购买 nike

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

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

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

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

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

形式:creator_id,姓名

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

form_field_option: form_field_id, name, value, order(这个用于radio/select/check)

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

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

据此构建表单并获得结果似乎相当容易。它可能完全有效也可能不完全有效,但假设一个典型的形式是 5-30 个问题,会那么糟糕吗?

将其放入 NoSQL 数据库(即 Mongo 或类似数据库)中有什么优势吗?如果是这样,你能给我具体的例子来说明它们是什么并给我一个样本设计吗?我见过很多答案,例如“NoSQL 更适合这个”,但我在这方面没有经验,是因为更快地检索结果,还是什么?使用 NoSQL 会带来哪些缺点?

谢谢

最佳答案

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

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

注意:

您只需将键存储在需要的地方,而不是像在关系数据库中那样为每个上下文中的每个事物都设置一个列。例如不需要 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

关于mongodb - 用于用户设计表单的数据存储 - NoSQL 对 EAV 的任何优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11318563/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com