【问题标题】:Flexible forms and supporting database structure灵活的表格和支持的数据库结构
【发布时间】:2011-06-03 17:02:48
【问题描述】:
【问题讨论】:
标签:
php
mysql
database-design
【解决方案1】:
几年前我创建了一个非常大的 EVA 数据库(PHP w/PostgreSQL)。结果很好,但这是一个大项目($$$)。所有表单都是完全动态的,具有表单/字段版本控制、发布工作流程、匹配动态报告等。
EVA 基础很简单。获取数据并不是困难的部分。但是表单版本控制和报告....您可以花费数年时间才能做到正确。
如果我今天再做一次,我会使用一种较新的 NoSQL 解决方案 (http://en.wikipedia.org/wiki/NoSQL#Document_store) 进行研究。我想创建一个可以传递给表单生成器的 DTO 样式类。 “修改”表单实际上是修改 DTO。然后我会将该 DTO 持久化到文档/对象数据库中。
此外,在构建 Alpha 版解决方案时,请考虑如何解决包含版本控制和报告需求的测试用例。
这是我的意思的一个例子:一个简单的“表单”。
- 原始(版本 1):有 First,Last,Question
- 添加电子邮件字段(版本 2):First,Last,Email,Question
- 有人改变了对电子邮件的看法:(版本 3):First,Last,Question
- 新的营销人员进来并更改它:(版本 4):全名、电子邮件、问题
现在,您需要生成一份报告 (csv)。事情变得棘手。你是怎么做到的?
我们通过引用之前版本的字段级版本控制解决了这个问题。另外,报表系统需要最终用户在运行前组装报表数据源的定义。 (将报告字段绑定到数据字段等)。
但是,对于文档数据库,我想您可以以不同的方式进行操作。我相信像 CouchDB(其他??)这样的新数据库具有内置的机制来处理这些问题。
祝你好运!!
【解决方案2】:
在我上一个 web 应用中开发用户配置文件时,我选择了 键/值表 方法。这是我的数据库设计的外观:
Users table with fixed columns:
id
login
name
regdate
与 Profiles 表(User HasMany Profile)链接的用户表。
Profiles table with different data:
user_id
field
value
这样,用户可以将任何附加字段添加到他的个人资料中。例如:
user_id = 1
field = 'Facebook'
value = 'http://facebook.com/...'
和
user_id = 1
field = 'Stackoverflow'
value = 'http://stackoverflow.com/user/...'
等等..
【解决方案3】:
根据您的需要,甚至将表单字段提升到“数据库字段”级别可能都不值得。相反,您可以在(本质上是一个)动态 blob 中序列化这些字段并将其存储在数据库中。如果您有人需要在您的应用程序之外查询这些动态字段(即,数据库设计是与集成系统的更大公共合同的一部分),则不建议这样做,但如果您只是使用该应用程序来简单地进行持久化这些动态字段,或者如果字段中的任何聚合/搜索功能很小,那么我会考虑它(尤其是这些天给定的 CPU 功能)。我已经多次使用该模式,而且我 - 到目前为止 - 从来没有重构过。 (但是,我可以理解您可能需要这样做的情况)。