1

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

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

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

使用上述设计,在大多数情况下,ValidationRuleType 可能只是“Regex”(或查找表中的值,例如“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             |
-------------------------------------------------------------
...

这是否更好?我对使用哪种方法感到矛盾。非常感谢我能得到的任何指导。

4

1 回答 1

1

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

于 2010-10-11T22:15:50.003 回答