Может ли кто-нибудь упростить это отношение таблицы MySQL для опросов? - PullRequest
1 голос
/ 06 сентября 2011
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 ]

2 голосов
/ 06 сентября 2011

Во-первых, всегда называйте свои таблицы в единственном числе. Это потому, что «определение таблицы» на самом деле является определением для каждой строки - одна строка (то есть единственное число). Кроме того, он выглядит более естественно: quiz.id имеет смысл - идентификатор теста, но quizzes.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
);    
0 голосов
/ 06 сентября 2011

Да, это идеальная организация.Единственное, что вы можете сохранить в «созданных» и «измененных» полях в таблицах опросов и опросов, оставив их только в «вопросах» и только в том случае, если «вопросы» вставляются одновременно с «опросом» или «опросом».....

лично для меня, похоже, слишком много полей даты.Я бы не стал их использовать, но организация, которую вы создали, действительна.Если вы опубликуете использование данных для этой проблемы, мы могли бы прокомментировать больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...