Php 我应该让用户在数据库中创建表还是创建视图?

Php 我应该让用户在数据库中创建表还是创建视图?,php,database-design,Php,Database Design,我使用的是cakephp,我需要让用户设计他们自己的表单(这在安装向导阶段只做一次,实际使用中创建了大约12个表单)。始终需要的表是用户、组和日志、设置。实际上,这是一个用户友好的数据库应用程序 我在考虑创建视图,并使用两个实际的表来存储表单和随后的数据: Forms [id | name | structure ] [1 | Details| {id:{type:key}q2:

我使用的是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... }}]
列“structure”将包含一个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]
表单数据表将包含表单每个字段的数据,调查id表示表单所涉及的对象,一个被调查的人可以有多个表单。键将是varchar,但值必须是可能的最大数据类型的大小(例如“段落文本”)


或者我应该让用户(通过params/sanitized等)执行一个“创建表”并在数据库中创建真实的表,这样我就可以充分利用系统查询和优化,并在cakephp中实现所有神奇的功能?

这取决于您以后想对数据做什么以及有多少数据。DBMS系统(如MySQL)处理大量数据的速度非常快。您还可以使用非常复杂的方式查询数据,而不是使用其他选择。取舍稍微复杂一点。我几乎总是站在数据库解决方案的一边。它为您提供了最大的灵活性。

这取决于您以后要对数据做什么以及将有多少数据。DBMS系统(如MySQL)处理大量数据的速度非常快。您还可以使用非常复杂的方式查询数据,而不是使用其他选择。取舍稍微复杂一点。我几乎总是站在数据库解决方案的一边。它为您提供了最大的灵活性。

您既不应该创建表也不应该创建视图,这两个想法都很糟糕,即使您对输入进行了清理,我也可以创建N个帐户并污染您的数据库,由于表/视图的原因,这会使维护成为一场噩梦。编辑:我看到你实际上不会在每次创建表单时创建视图,因此-是的,创建一个视图和你需要的两个基础表,这比创建表安全得多。如果有一个提升的超级用户帐户(受IP地址限制)可以运行应用程序的创建表代码部分呢?如果你动态创建表单,您不会创建包含数据的表。是的,如果我们能够做到这一点,那就太好了,您只需要查询一个表(或一组表),但关系数据库并不适合这样做。在这里,您可以使用EAV方法,其中已经创建了表,并且它们的模式支持所有字段和值的无限增长形式,或者简单地使用无模式数据存储层,比如MongoDB或类似的NoSQL解决方案,它们不依赖于结构。在您认为需要动态创建表的那一刻,您就做错了。因为不会有无限量的表单被创建,所以在“设置”阶段只需要设置一个数字,在此期间,他们将有一个临时用户帐户来设置数据库。EAV方法很复杂,我将失去cakephp的魔力。你既不应该创建表也不应该创建视图,这两个都是糟糕的想法,即使你清理了输入等等,我也可以创建N个帐户并污染你的数据库,由于表/视图的原因,这实际上使维护成为一场噩梦。编辑:我看到你实际上不会在每次创建表单时创建视图,因此-是的,创建一个视图和你需要的两个基础表,这比创建表安全得多。如果有一个提升的超级用户帐户(受IP地址限制)可以运行应用程序的创建表代码部分呢?如果你动态创建表单,您不会创建包含数据的表。是的,如果我们能够做到这一点,那就太好了,您只需要查询一个表(或一组表),但关系数据库并不适合这样做。在这里,您可以使用EAV方法,其中已经创建了表,并且它们的模式支持所有字段和值的无限增长形式,或者简单地使用无模式数据存储层,比如MongoDB或类似的NoSQL解决方案,它们不依赖于结构。在您认为需要动态创建表的那一刻,您就做错了。因为不会有无限量的表单被创建,所以在“设置”阶段只需要设置一个数字,在此期间,他们将有一个临时用户帐户来设置数据库。EAV方法很复杂,我将失去cakephp的魔力。