任何人都可以为民意调查简化这个MySQL表关系吗?

时间:2011-09-05 20:44:53

标签: mysql sql

create table polls (
  id integer not null auto_increment primary key, 
  created datetime, 
  modified datetime
);

create table quizzes (
  id integer not null auto_increment primary key,
  created datetime,
  modified datetime
);

create table questions (
  id integer not null auto_increment primary key,
  model varchar(255) not null, -- Poll or Quiz, in this scenario
  foreign_key integer not null,
  question varchar(255) not null,
  created datetime,
  modified datetime
);

create table answers (
  id integer not null auto_increment primary key,
  question_id integer not null,
  answer varchar(255) not null,
  created datetime,
  modified datetime
);

对于民意调查和测验表,任何人都可以使它更简单(更短)且更有意义吗?

这是另一个想法,哪个更好? =>

| polls | CREATE TABLE `polls` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `question` varchar(300) NOT NULL,
  `mark` tinyint(4) NOT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |



| pollanswers | CREATE TABLE `pollanswers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `poll_id` int(11) NOT NULL,
  `answer` varchar(300) NOT NULL,
  `percentage` int(11) NOT NULL,
  `correct` tinyint(4) NOT NULL,
  `mark` tinyint(4) NOT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |

2 个答案:

答案 0 :(得分:2)

首先,始终以单数形式命名表格。这是因为“表定义”实际上是每行的定义 - 一个行(即单数)。此外,它更自然地读取:quiz.id有意义 - 测验的ID,但quizzes.id是什么?测验的ID?否。

要回答您的问题,您一定要将民意调查和测验合并到一个表中。提示是他们有相同的定义。如果你需要区分这两者,有一个布尔列。我们称之为测验。

您还应将外键命名为“table_id”,例如“quiz_id”。

你应该给你的测验命名。

在mysql中,每当您更改行中的某些内容时,timestamp数据类型会自动更新。它非常方便 - 保存为每个更新/插入值集添加now()

恕我直言,你的桌子应该是:

create table quiz (
  id integer not null auto_increment primary key,
  created datetime,
  modified timestamp,
  name text,
  is_poll boolean not null default false
);

create table question (
  id integer not null auto_increment primary key,
  quiz_id integer not null references quiz,
  question varchar(255) not null,
  created datetime,
  modified timestamp
);

create table answer (
  id integer not null auto_increment primary key,
  question_id integer not null references question,
  answer varchar(255) not null,
  created datetime,
  modified timestamp
);    

答案 1 :(得分:0)

是的,这是一个完美的组织。唯一的问题是,您可以在民意调查和测验表中保存“已创建”和“已修改”字段,只留下“问题”,并且只有在“民意调查”或“测验”同时插入“问题”时才会这样。 ....

对我而言,看起来像是太多的日期字段。我不会使用它们,但你放的组织是有效的。如果您要发布此问题的数据使用情况,我们可以发表更多评论。