7

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

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

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

问题:

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

2 回答 2

3

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

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

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

于 2009-10-31T13:12:59.627 回答
3

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 字段的列。更辛苦的工作...

于 2009-10-31T13:55:32.060 回答