English 中文(简体)
MySQL列具有各种类型
原标题:
  • 时间:2008-11-26 16:47:41
  •  标签:

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

我过去所采用的方法是:

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

  2. 有两个列-一个为文本,一个为整数。然后,每行每个响应只填写一个,将另一个列保留为空。

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

虽然我并不真的喜欢其中的任何一种处理方法,但我有一种感觉,一定有更好的方法来处理这种情况。

为了让它更具体化,这里举一个我可能拥有的表格的例子:

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   
)

或者,如果我选择使用上面的第二种选项:

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表。

这些方法中有没有正确的方法,或者我错过了一个明显的替代方案?

最佳回答

"选项2不是最规范的选择,正如@Ray所声称的那样。最规范的选择将没有可空字段,显然选项2需要在每行上添加一个空值。"

在您的设计中,您需要考虑使用情况、您要查询的内容以及您要编写的报告。您是否想同时对所有数字响应进行数学运算?即 WHERE numeric_response IS NOT NULL?可能性很小。

更有可能的是,“当问题= 11时,平均响应是多少?”在这些情况下,您可以选择INT表或INT列,两者都不比另一个更容易。

如果您确实制作了两个表格,那么您很可能会不断地将它们联合在一起,以回答诸如“有多少问题有答案的百分比”之类的问题。

你能看出你询问数据库以回答问题的方式开始驱动设计了吗?

问题回答

我会选择选项1。答案通常是文本字符串,但有时文本字符串恰好代表一个整数。更难的是确定对于给定问题对答案是否应该施加任何限制。如果某些答案应该只是一个或多个数字的序列,如何验证?很可能,问题表应该包含有关可能答案的信息,并且应该指导验证。

我注意到问题ID和用户ID的组合(或应该是)在给定的问卷中是唯一的。因此,您真的不需要答案中的自动递增列。无论您是否保留自动递增列,您也应该在QuestionID和UserID上设置唯一约束(或主键约束)。

选项2是正确的,最规范的选项。





相关问题
热门标签