【问题标题】:Database design for custom form builder (and storage of results)自定义表单构建器的数据库设计(和结果存储)
【发布时间】:2010-12-11 21:05:01
【问题描述】:
我正在尝试实现一个自定义表单构建器,类似于Wufoo 和Google 提供的那些。
虽然我创建了一个简单的 UI 来创建这些自定义表单,但我的问题在于数据库设计。创建表单后,JSON 实现会保存在数据库中(希望对此进行改进)并引用以构建用户将看到的表单。
提交后,我想将表单的所有字段存储在数据库中。遵循用于设计数据库的 JSON 结构,这很容易。但是我希望每个单独的字段都可以搜索。
问题:
- 有没有更好的方式来存储表单设计?
- 哪些数据结构/模型适合存储表单结果? 我已经看到 EAV 可能是一种可能性,但由于涉及不同的输入类型(下拉、复选框、文本、文本区域),这可能会变得乏味。
- 哪种结构允许最简单的搜索并允许使用 WHERE 子句? 给出的 JSON 示例并不能很好地做到这一点
【问题讨论】:
标签:
sql
mysql
database-design
forms
entity-relationship
【解决方案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 字段的列。工作更加艰巨......