动态表单字段验证的数据库设计

时间:2010-10-11 21:59:56

标签: mysql database erd database-design

在我的应用程序中,我允许用户创建一个包含他们想要的任何HTML表单字段的表单(例如文本输入,文本区域,选择等)。我想让用户能够为每个字段定义0个或更多累积验证规则(最多可能有25个不同的验证规则)。我该如何塑造这个?

这是一个潜在的解决方案:

============================================================
| Id | FieldId | ValidationRuleType | ValidationRuleDetail |
============================================================
| 1  | 25      | Required           | NULL                 |
------------------------------------------------------------
| 2  | 26      | Minimum Length     | 5                    |
------------------------------------------------------------
| 3  | 26      | Maximum Length     | 12                   |
------------------------------------------------------------
...

使用上述设计,在大多数情况下,ValidationRuleType可能只是“正则表达式”(或查找表中的值,例如“Regex”的ValidationRuleTypeId = 1),并使用以下内容进行ValidationRuleDetail:

// Added bonus of this approach is that users who know regex could define their own patterns
.{1,}  // Any character, 1 or more times. Use for "Required"
.{5,}  // Any character, 5 or more times. Use for "Minimum Length = 5"
.{,12} // Any character, 12 or less times. Use for "Maximum Length = 12"

问题是这个解决方案是EAV。这是件坏事,对吗?

另一个可能的解决方案:

=============================================================
| Id | FieldId | Required | Minimum Length | Maximum Length |
=============================================================
| 1  | 25      | TRUE     | NULL           | NULL           |
-------------------------------------------------------------
| 2  | 26      | NULL     | 5              | 12             |
-------------------------------------------------------------
...

这样更好吗?我对使用哪种方法感到矛盾。我能得到的任何指导都非常感激。

1 个答案:

答案 0 :(得分:1)

答案完全取决于您希望验证规则如何工作。如果您要拥有的只需要/ min / max,那么它们应该只是该字段的列(最后一个选项)。如果验证规则定义了一组特定的动态规则,它们应该在它们自己的表中,并且验证规则和字段ID之间应该存在映射(在这种情况下,您应该能够将相同的字段ID映射到多个验证规则)。然后查询字段,与映射表连接并加入规则以将规则应用于该字段。