【问题标题】:Database design for custom form builder (and storage of results)自定义表单构建器的数据库设计(和结果存储)
【发布时间】:2010-12-11 21:05:01
【问题描述】:

我正在尝试实现一个自定义表单构建器,类似于WufooGoogle 提供的那些。

虽然我创建了一个简单的 UI 来创建这些自定义表单,但我的问题在于数据库设计。创建表单后,JSON 实现会保存在数据库中(希望对此进行改进)并引用以构建用户将看到的表单。

提交后,我想将表单的所有字段存储在数据库中。遵循用于设计数据库的 JSON 结构,这很容易。但是我希望每个单独的字段都可以搜索

问题:

  1. 有没有更好的方式来存储表单设计?
  2. 哪些数据结构/模型适合存储表单结果? 我已经看到 EAV 可能是一种可能性,但由于涉及不同的输入类型(下拉、复选框、文本、文本区域),这可能会变得乏味。
  3. 哪种结构允许最简单的搜索并允许使用 WHERE 子句? 给出的 JSON 示例并不能很好地做到这一点

【问题讨论】:

    标签: sql mysql database-design forms entity-relationship


    【解决方案1】:

    EAV 是一个有效的选项 - 它可能会变得复杂而尴尬,因为它实际上变成了无类型数据。

    带有 XPath 的 XML 也是一个选项:http://dev.mysql.com/tech-resources/articles/xml-in-mysql5.1-6.0.html

    如果要搜索的字段可能不同,我认为大多数情况都需要您生成动态 SQL。

    【讨论】:

      【解决方案2】:

      EAV 工作得很好,因为您通常可以将映射值映射到一些基本类型。在个人项目中,我们有一张桌子:

      entity_id     : INTEGER REFERENCES entities(id)
      attr_id       : INTEGER REFERENCES attributes(id)
      value_bool    : BOOLEAN
      value_int     : INTEGER
      value_string  : VARCHAR
      value_text    : TEXT
      

      关于 attr_id 的信息存储在另一个表中,我们可以在其中找到属性 类型和名称等。字符串和文本之间的区别还在于,文本可以有一个“全文”搜索索引,而字符串只是基本的匹配索引。

      当您想查询属性时,您可以在属性表中查找它,然后通过设置正确的条件(例如“WHERE attr_id=12 AND value_string='sfds'”)来构造查询。

      要加快查询速度,请在双列上创建条件索引,如下所示:

      CREATE INDEX test ON eav(attr_id, value_int) WHERE value_int IS NOT NULL;
      

      另一种方法是使用自定义 db 函数,该函数可以索引和搜索包含 JSON 字段的列。工作更加艰巨......

      【讨论】:

        猜你喜欢
        • 2011-04-09
        • 2023-03-06
        • 2021-04-05
        • 1970-01-01
        • 2010-11-17
        • 2012-01-25
        • 1970-01-01
        • 2016-03-23
        • 2013-02-17
        相关资源
        最近更新 更多