MySQL列有各种类型

时间:2008-11-26 16:47:41

标签: mysql database-design

我似乎经常发现自己想在MySQL数据库的同一列中存储多种类型的数据(通常是整数和文本)。我知道这很糟糕,但它发生的原因是我存储了人们在问卷中提出问题的回复。有些问题需要整数响应,有些需要文本响应,有些可能是从列表中选择的项目。

我过去采取的方法是:

  1. 将所有内容存储为文本,并在以后需要时转换为int(或其他)。

  2. 有两列 - 一列用于文本,一列用于int。然后,您只需在每个响应中每行填充一个,并将另一个保留为空。

  3. 有两个表 - 一个用于文本响应,一个用于整数响应。

  4. 我真的不喜欢这些,我觉得必须有更好的方法来处理这种情况。

    为了使其更具体,这里是我可能拥有的表格的一个例子:

    CREATE TABLE question (
      id int(11) NOT NULL auto_increment,
      text VARCHAR(200) NOT NULL default '',
      PRIMARY KEY ('id')
    )
    
    CREATE TABLE response (
      id int(11) NOT NULL auto_increment,
      question int (11) NOT NULL,
      user int (11) NOT NULL,
      response VARCHAR(200) NOT NULL default ''
    )
    

    或者,如果我使用上面的选项2:

    CREATE TABLE response (
      id int(11) NOT NULL auto_increment,
      question int (11) NOT NULL,
      user int (11) NOT NULL,
      text_response VARCHAR(200),
      numeric_response int(11)
    )
    

    如果我使用选项3,则会有一个responseInteger表和一个responseText表。

    这些是正确的方法,还是我错过了一个明显的选择?

3 个答案:

答案 0 :(得分:4)

[选项2]不是最正常化的选项[如@Ray所声称]。标准化程度最高的字段没有可空字段,显然选项2在每一行都需要空值。

在您的设计中,您必须考虑使用情况,您将要执行的查询以及您要编写的报告。您想同时对所有数字响应进行数学运算吗?即WHERE numeric_response不是NULL?可能不太可能。

更有可能是,什么是平均响应WHERE问题= 11.在这些情况下,您可以选择INT表或INT列,并且两者都不会比另一个更容易。

如果你确实做了两个表,那么你很可能会不断地将它们联合起来解决问题,例如,有多少问题都有答案等。

您能看到您要求数据库回答的问题如何开始推动设计?

答案 1 :(得分:2)

我选择选项1.答案总是文本字符串,但有时文本字符串恰好是整数的表示。不那么容易的是确定应该对给定问题的答案施加什么约束(如果有的话)。如果某些答案应该只是一个或多个数字的序列,那么如何验证?最有可能的是,问题表应该包含有关可能答案的信息,这应该指导验证。

我注意到QuestionID和UserID的组合是(或应该是)唯一的(对于给定的问卷)。所以,你真的不需要答案中的自动增量列。无论如何,您还应该在QuestionID和UserID上具有唯一约束(或主键约束)(无论您是否保留自动增量列)。

答案 2 :(得分:0)

选项2是正确的,最正常化的选项。

相关问题