什么是最好的:每个记录1个表或1个表,所有记录都与外键相关联?

Tiv*_*vie 6 database sqlite android database-design

我有一个应用程序,允许用户创建不同的表单(调查),然后填写它们.(所以它可以替代纸张).

这是我在应用程序中使用的当前模型:

 Table 1)
+-------------------------+
|      SURVEYS TABLE      |   
+----+------+-------------+
| ID | name | description |  
+----+------+-------------+

 Table 2)   
+-----------------------------------+
|       $[name_of_the_survey]       |
+----+-------+------+-------+-------+
| ID | field | type | value | items |
+----+-------+------+-------+-------+


 Table 3)
+--------------------------------------+
|    $[name_of_the_survey] _records    |
+----+---------------------------------+
| ID | columns specific to each survey |
+----+---------------------------------+
Run Code Online (Sandbox Code Playgroud)

所以基本上当用户创建调查时,程序会在Surveys Table中插入一条记录,然后创建2个表:

表(2)用于表格(3)的字段,用于将要存储的记录,其中列对应于表(2)行.

它有效,但有一些局限性.例如,当您向表(2)添加字段时,它必须读取表(3)内容,将其保存到虚拟表,删除上一个表(3)并创建一个新表.当表(3)具有大量记录时,这可能是性能问题.

所以我的问题是......有更好的数据库设计吗?

Mik*_*key 3

对每个调查使用单独的表几乎使数据库的使用失效。您不妨将结果存储在文件中。

但是,您确实需要三个表:调查定义、调查问题和调查答案。它可能看起来像这样......

Surveys:
ID; name; description

Questions:
ID; text; surveyID

Answers:
ID; answer; questionID
Run Code Online (Sandbox Code Playgroud)

您可以从那里增加复杂性来处理枚举的答案......

Surveys:
ID; name; description

Questions:
ID; text; surveyID

Choices:
ID; choice; questionID

Answers:
ID; choiceID
Run Code Online (Sandbox Code Playgroud)

您可以使用每个表之间的关系来聚合到下一个最高级别,从而允许您从任何问题、调查或您选择添加的任何模型的任何其他属性中获取结果,而无需尝试抽象出所选语句的源。这还允许您稍后将每个用户或调查组织的答案添加到您的架构中后进行汇总。如果每个调查都有自己的表结构,那么随着应用程序的增长,跨调查聚合数据就变得非常不切实际。