【发布时间】:2013-06-18 20:05:48
【问题描述】:
我正在使用 cakephp,我需要让用户设计自己的表单(这只会在设置向导阶段完成一次,实际使用中创建了大约 12 个表单)。始终需要的表是用户、组和日志、设置。实际上,这是一个用户友好的数据库应用程序。
我正在考虑创建视图并有两个实际的表来存储表单和后续数据:
Forms [id | name | structure ]
[1 | Details| {id:{type:key}q2:{type:text;validation:{select:male..}..} ]
[2 | Car | {id:{type:key};car:{type:text;validation:{select:Honda... }}]
“结构”列将包含列出字段、类型和验证规则的 json 或 xml 字符串。
Forms_data [id | form_id | survey_id | key | value ]
[1 | 1 | 1 | q1 | Male ]
[2 | 1 | 1 | q2 | 1/1/76]
[3 | 2 | 1 | Car | Honda]
[4 | 2 | 1 | Eng | Petrol]
[5 | 1 | 2 | q1 | Fem ]
[6 | 1 | 2 | q2 | 2/3/81]
[7 | 2 | 2 | Car | Ford ]
[8 | 2 | 2 | Eng | Diesel]
Forms_data 表将包含表单的每个字段的数据,survey_id 表示表单所针对的对象,一个被调查的人可以针对他们完成许多表单。键是 varchar,但值必须是最大可能数据类型的大小(例如“段落文本”)。
或者我应该让用户(通过 params/sanitised 等)执行“CREATE TABLE”并在数据库中创建真正的表,这样我就可以充分利用系统查询和优化,并在 cakephp 中获得所有神奇的功能工作吗?
【问题讨论】:
-
你既不应该创建表也不应该创建视图,这都是很糟糕的想法,即使你清理了输入等等,我也可以创建 N 个帐户并污染你的数据库,这实际上使它成为维护到期的噩梦到表/视图。编辑:我看到您实际上不会在每次创建表单时都创建视图,因此 - 是的,创建一个视图和您需要的两个基础表,它比创建表更安全。
-
如果有一个提升的超级用户帐户(受IP地址限制)可以运行应用程序的创建表代码部分?
-
如果您即时创建表单,则不会创建保存数据的表。是的,如果我们能做到这一点,那就太好了,您只需要查询一个表(或一组表),但关系数据库并不适用于此。您可以在此处使用 EAV 方法,其中您的表已经创建并且它们的模式支持具有所有字段和值的无限增长形式,或者只是使用无模式数据存储层,如 MongoDB 或不依赖的类似 NoSQL 解决方案一个结构。当您认为需要即时创建表格时,您就做错了。
-
由于不会创建无限数量的表单,只是在“设置”阶段设置了一个数量,在此期间他们将拥有一个用于设置数据库的临时用户帐户。 EAV 方法很复杂,我会失去 cakephp 的魔力。
标签: php database-design