【问题标题】:Data model for a extensible web form可扩展 Web 表单的数据模型
【发布时间】:2010-09-07 03:06:06
【问题描述】:
假设我有一个包含三个 10 字段的表单:field1..field10。我将表单数据存储在一个或多个数据库表中,可能使用 10 个数据库列。
现在假设几个月后我想再添加 3 个字段。将来我可能会根据不断变化的要求在此表单中添加/删除字段。如果每个表单字段都有一个数据库列,那么每次更改表单时都必须对数据库进行相应的更改。这似乎是一个令人头疼的维护问题。一定有更复杂的方法。
所以我的问题是,如何设计一个与我的 UI 松散耦合的数据模型?一个具体的用例是用户可扩展/可定制的 CRM 系统。
【问题讨论】:
标签:
database-design
forms
【解决方案1】:
您可以将字段抽象到单独的表中,以便它们与 Form 表是多对多的:
表格
ID
名称
等等
字段
ID
标签
价值
表单域
FormID
FieldID
【解决方案2】:
除非您有充分的理由这样做,否则这通常是个坏主意。这使得优化和扩展数据库变得非常困难。
如果您绝对必须这样做,那么 Travis 的建议对于小型表来说是可以的,但它并不能真正很好地扩展。
【解决方案3】:
当我在 AIMS (www.totalaims.com) 上为 Quest Computing 工作时,我的团队为此提出了一个解决方案。总之,我们添加了维护屏幕,允许管理员添加元数据,并因此在某些表中向数据库添加字段。这些字段也被自动添加到它们自己的维护和搜索屏幕中。我们在 OpenACS 之上构建了它。您可以在 www.openacs.org 找到更多信息 - 搜索“flexbase”或“dynfields”或查看此处 www.project-open.org/doc/intranet-dynfield/。这工作得很好——它们的主要缺点是主要优点的副作用,即非 DBA 可以添加字段,因此很容易影响性能。
【解决方案4】:
我过去曾使用数据库中的 XML 列来存储额外字段。我通常在 XML 列中有一个大的属性包,然后在进行更新或插入时使用 XSD 来强制验证。当我检索数据时,我在 XSL 或对象模型中有规则来确定是否显示元素、应用哪些附加格式以及基于属性节点中的数据类型为 Web 表单使用哪种类型的输入元素。
如果需要将一些数据以关系方式存储,而将其他数据以可扩展方式存储,以避免出现大量空行的宽表效应,那么它的效果非常好。
如果您不需要对数据进行关系处理,例如与数据库中的其他表连接或旋转,那么简单的自包含 XML 表单也是一个很好的解决方案。
现在大多数数据库都对此类事物提供一流的 XML 支持。例如,在 SQL Server 中,您可以将 XSD 架构应用于数据库中 XML 数据类型的列。在最近的版本中,还支持对这些列进行索引。