代码之家  ›  专栏  ›  技术社区  ›  Tivie

什么是最好的:每个记录1个表,或者所有记录都与外键链接的1个表?

  •  6
  • Tivie  · 技术社区  · 14 年前

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

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

     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)中的字段 将要存储的记录的表(3),其中的列对应于表(2)行。

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

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

    2 回复  |  直到 14 年前
        1
  •  3
  •   Mike Yockey    14 年前

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

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

    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
    

    您可以使用每个表之间的关系聚合到下一个最高级别,从而使您能够从任何问题、调查或任何其他属性中获得要添加的模型的结果,而不必尝试为select语句提取源。这还允许您在以后将每个用户或测量组织的答案添加到您的模式中之后对它们进行聚合。如果每个调查都有自己的表结构,那么随着应用程序的增长,跨调查聚合数据变得非常不切实际。

        2
  •  1
  •   Hos    14 年前

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

    一般来说,上述是改善DBS的一种非常正式的方式,其中一些步骤与您的DB有关。我觉得所有的ID字段都有点混乱。你真的每个人都需要它们吗?调查名称是否不唯一?

    您已经暗示了调查数据字段是非常独特的。就我个人而言,我会把每个调查整理成一个文件,然后给它一个标准格式。如果倾向于同时阅读整个调查,这不是一个坏主意。我只会在需要排序或选择数据位时使用数据库。