可扩展Web表单的数据模型

时间:2020-03-05 18:44:21  来源:igfitidea点击:

假设我有一个包含三个10个字段的表单:field1..field10. 我将表单数据存储在一个或者多个数据库表中,可能使用10个数据库列。

现在假设几个月后,我想再添加3个字段。将来,我可能会根据不断变化的要求在此表单中添加/删除字段。如果每个表单字段都有一个数据库列,那么每次更改表单时,都必须对数据库进行相应的更改。这似乎是维护方面的头痛。必须有更复杂的方法。

所以我的问题是,如何设计与UI松散耦合的数据模型?一个具体的用例是用户可扩展/可定制的CRM系统。

解决方案

回答

我们可以将字段抽象到一个单独的表中,以便它们相对于Form表是多对多的:

形式

ID
姓名
等等。

场地

ID
标签
价值

表单域

表格ID
栏位编号

回答

除非我们有充分的理由这样做,否则通常这是一个坏主意。这使得优化和扩展数据库非常困难。

如果我们绝对必须这样做,那么Travis的建议适用于小桌子,但实际上并不能很好地进行扩展。

回答

当我在AIMS(www.totalaims.com)上为Quest Computing工作时,我的团队提出了一个解决方案。总而言之,我们添加了维护屏幕,该屏幕允许管理员添加元数据,并因此在某些表中向数据库添加字段。这些字段也自动添加到其自己的维护和搜索屏幕中。我们在OpenACS之上构建了这个。我们可以在www.openacs.org上找到更多信息,搜索" flexbase"或者" dynfields",或者在此处查看www.project-open.org/doc/intranet-dynfield/。这对于他们的主要不利方面非常有效,这是主要不利方面的副作用,即,非DBA可以添加字段,因此很容易损害性能。

回答

我过去使用数据库中的XML列来存储额外的字段来完成此操作。我通常在XML列中只有一个很大的属性包,然后在执行更新或者插入操作时使用XSD强制执行验证。检索数据时,我在XSL或者对象模型中有规则来确定是否显示该元素,要应用的其他格式以及对于Web表单,应基于属性节点中的数据类型使用哪种类型的输入元素。

如果需要以关系方式存储一些数据,并以可扩展的方式存储其他数据,以避免宽表具有大量空行的影响,则该方法非常有效。

如果我们不需要对数据进行关系处理,例如与数据库中的其他表联接或者枢转,那么简单的自包含XML格式也是一个很好的解决方案。

现在,大多数数据库都对此类事情提供了一流的XML支持。例如,在SQL Server中,我们可以在datbase中将XSD架构应用于XML数据类型的列。在最新版本中,还支持在这些列上建立索引。