我的任务是创建一个允许管理员改变用户输入表单内容的应用程序(即添加任意字段) - 其内容存储在数据库中。想想Modx / Wordpress / Expression Engine模板变量。
我一直在研究的方法是实现规范一致的具体表(即用户配置文件,用户内容等)和一些通用字段数据表(即文本,布尔值)来存储非特定值。表单(和模型字段)将通过首先查询表并检索相关列来生成 - 尽管我还没有考虑如何设置验证。
我已经看过这个问题了,它似乎表明了一种EAV类型的方法 - 从我的简短研究中看来,它似乎比它的灵活性所带来的祝福更大的负担。
我在这里读了几篇文章,但这表明这是一条危险的路线:
How to design a generic database whose layout may change over time?
如果有人要提供
,我会对此事提出一些建议问候
SWK
答案 0 :(得分:3)
我几年前创建了一个非常大的EVA数据库(PHP w / PostgreSQL)。结果很棒,但这是一个大项目($$$)。所有表单都是完全动态的,包括表单/字段版本控制,发布工作流程,匹配动态报告等。
EVA基础知识很简单。获取数据并不困难。但是形成版本控制和报告....你可以花费数年时间来做正确的事。
如果我今天再次这样做,我会研究使用一种较新的NoSQL解决方案(http://en.wikipedia.org/wiki/NoSQL#Document_store)。我想创建一个可以传递给表单生成器的DTO样式类。 “修改”表单实际上是修改DTO。然后我会将DTO保存到文档/对象数据库中。
此外,在构建alpha解决方案时,请考虑如何解决包含版本控制和报告需求的测试用例。
这是我的意思的一个例子:一个简单的“提问题表”。
现在,您需要生成报告(csv)。事情变得棘手。你是怎么做到的?
我们通过引用其先前版本的字段级版本解决了这个问题。此外,报告系统要求最终用户在运行之前汇总报告数据源的定义。 (将报告字段绑定到数据字段等)。
然而,对于文档DB,我想你可以采用不同的方式。我相信新的数据库就像CouchDB(其他人)已经内置了处理这些问题的机制。
祝你好运!答案 1 :(得分:1)
在我上一次开发的网络应用中开发用户个人资料时,我选择了键/值表方法。以下是我的数据库设计的外观:
Users table with fixed columns:
id
login
name
regdate
与个人资料表关联的用户表(用户HasMany个人资料)。
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/...'
依旧......
答案 2 :(得分:0)
根据您的需要,甚至可能无法将表单字段提升到“数据库字段”级别。您可以在(基本上是一个)动态blob中序列化这些字段并将其存储在DB中。如果您有人需要在您的应用程序之外查询这些动态字段(即,数据库设计是与集成系统签订的更大的公共合同的一部分),则不建议这样做,但如果您只是使用该应用程序只是为了坚持这些动态字段或者如果字段中的任何聚合/搜索功能都很小,那么我会考虑它(特别是这些天给定的CPU功能)。我已经多次使用过该模式,到目前为止,我从未进行过重构。 (但是,我可以理解你可能需要的情况)。