当用户可以在mongodb中发布一个自由结构数据时,最好的schama设计是什么

5tmbdcev  于 2023-03-07  发布在  Go
关注(0)|答案(1)|浏览(115)
    • bounty将在23小时后过期**。回答此问题可获得+100声望奖励。Kent Wood希望引起更多人关注此问题。

我在考虑一个表单创建器应用程序。用户可以设计自己的表单,他们可以添加他们想要的字段。
例如,一个用户可以提交一个雇用表单,在该表单中可能包括一些字段,如"工作经验"、"教育程度"等。他提供这些字段的一些选择选项,然后当他发布该表单时,求职者提交该表单。然后他可以查看结果列表,并且可能他需要通过"工作经验"来过滤人员。所以这意味着他刚添加到表单中的字段需要我索引。
在这种情况下,如何在mongodb中设计模式?
到目前为止,我可以成像是一个Forms集合,具有一些普通字段,如作者、日期、位置等,还有一个content字段,所有用户定义的表单数据都作为JSON对象存储在该字段中。
我将在上面的示例中以这种方式添加索引

db.forms.createIndex({"content.workexp" : 1})

我的问题是:
1.如果我真的喜欢这个,那对立面是什么?
1.如果我没有索引自定义字段内,发生了什么事到其他用户的自定义表单数据,没有这样的字段?
1.有没有更好的办法来达到这个目标呢?
(更新)
我将设计类似于this,因为forms记录表单模板,并将其Map到另一个集合(通过entity字段)在我的示例数据中,形式为resume的第一记录Map到resumes集合,这意味着定义forms的第一记录中的结构字段的新恢复数据,最后将存储在resumes集合中。
到目前为止看起来还不错,但是,因为一个表单记录Map到一个集合,会产生大量的集合。另一个问题是,如果两个记录Map到同一个集合,会使结构不能保持一致。
这个设计是可以与小企业自己,但如果我的purporse是一个平台,每个机构创造无限的形式,这将是一个问题。

2wnc66cl

2wnc66cl1#

我不能肯定这是否符合你要求,但我的意见是,
我假设您的用户是公司/组织,并且该功能中会有一些问题

  • 如果他们需要另一张表格怎么办?its needs form builders
  • 我想创建字段为required和/或optional的表单

如果我们看一下大型平台,比如JIRA Software
这是他们一个小复制品:
将存在3种模式:fields, forms, tables

  • fields集合这应该是公共的(任何人都可以看到),
let fields =
{
  _id: "ObjectId",
  name: "string", // my field
  fields: [
    {
      id: "ObjectId"
      type: {
        type: "string",
        enum: ["heading", "paragraph", "input", "checkbox"], // maybe you can add more types
      },
      name: { type: "string" }, //html standart
      text: { type: "string" }, //html standart
      label: { type: "string" }, //html standart
      placeholder: { type: ["string", "null"] }, //html standart
      required: { type: "boolean", enum: [true, false] }, //html standart
      fileID: { type: ["string", "null"] }, // may be needs type file(s)
    },
  ],
};
  • forms集合

在FORM API中,将需要创建2个集合formsfields,原因是:允许用户创建任何类型的字段(因为任何字段都将是模板)
因此,我们只需要检查字段长度,如果字段长度=== 0,则创建新的fields,否则为fields = [ ObjectId(id)]

let forms =
{
  _id: "ObjectId",
  companyId: "ObjectId", //this is used to make this form will be own by the company
  name: "string", // work-experience,
  formRef: "reff", // optional, maybe you will need function like `copy` in the feature.
  fields: [
    {
      id: "ObjectId"
      type: {
        type: "string",
        enum: ["heading", "paragraph", "input", "checkbox"],
      },
      name: { type: "string" },
      text: { type: "string" },
      label: { type: "string" },
      placeholder: { type: ["string", "null"] },
      required: { type: "boolean", enum: [true, false] },
      fileID: { type: ["string", "null"] },
    },
  ],
};
  • tables集合作为模板表单
let tables = {
  _id: "ObjectId",
  companyId: "ObjectId",
  name: "string",
  formId: "ObjectId",
};

通过在表和表单中使用companyId,我们已经减少了map函数。请告诉我您的意见

相关问题