【问题标题】:What is best: 1 table per record or 1 table with all records linked with foreign keys?什么是最好的:每条记录 1 个表或 1 个表,所有记录都与外键链接?
【发布时间】:2011-05-14 14:20:45
【问题描述】:

我有一个应用程序可以让用户创建不同的表格(调查)然后填写它们。 (所以它可以代替纸)。

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

 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 |
+----+---------------------------------+

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

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

它可以工作,但有一些限制。例如,当您向表 (2) 添加一个字段时,它必须读取表 (3) 的内容,将其保存到虚拟表中,删除以前的表 (3) 并创建一个新表。当 table(3) 有很多记录时,这可能是一个性能问题。

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

【问题讨论】:

  • 创建新表而不是在表中包含对父表具有外键的列的原因是什么?
  • 好吧,所有 Table(2) 都可以聚合在一个表中,为 table(1) 添加一个外键。但是表 (3) 不能,因为我事先不知道调查将包含哪些字段和多少个字段。

标签: android database database-design sqlite


【解决方案1】:

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

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

Surveys:
ID; name; description

Questions:
ID; text; surveyID

Answers:
ID; answer; questionID

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

Surveys:
ID; name; description

Questions:
ID; text; surveyID

Choices:
ID; choice; questionID

Answers:
ID; choiceID

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

【讨论】:

  • 哇。而已。杰出的。实现起来更简单,也更灵活。非常感谢!
【解决方案2】:

你可以试试看http://en.wikipedia.org/wiki/Database_normalization#Normal_forms

以上是总体上改进数据库的一种非常正式的方法,其中一些步骤与您的数据库相关。我认为这与所有 ID 字段有点混淆。你真的每个人都需要它们吗?调查名称不是唯一的吗?

您暗示调查数据字段非常独特。就我个人而言,我会将每个调查整理成一个文件,然后给它一个标准格式。如果倾向于一次阅读整个调查,这不是一个坏主意。如果我需要对数据进行排序或挑选,我只会使用数据库。

【讨论】:

  • 这是我的第一个方法。然而,问题在于编辑现有文件。例如,如果用户创建一个包含五个字段的调查表。然后决定删除其中之一。我现在只需要更改有关调查字段的文件,还要更改记录本身。例如,删除 CSV 中的特定字段是一件令人头疼的事情。我必须做很多字符串操作才能删除正确的字段。
猜你喜欢
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2020-01-16
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
相关资源
最近更新 更多