Мой веб-сайт позволяет людям создавать викторины. Каждая викторина содержит до 20 вопросов, а каждый вопрос - до 5 ответов. У меня есть таблица в базе данных для викторин, вопросов и ответов. Это означает, что в одной викторине может быть 121 строка. Есть ли лучший способ справиться с этим, например, поместить ответы на викторину в отдельный столбец в таблице вопросов?
«Есть ли лучший способ справиться с этим, например, поместить ответы на вопросы в отдельном столбце в таблице вопросов?» -> Вы не хотите скрывать строки в столбцах, поверьте мне, у вас возникнут проблемы позже.
В качестве основного общего правила: если A может иметь более одного B, тогда A и B должны быть отдельными таблицами. Исправленное количество строк указывает на то, что вы обрабатываете его правильно.
@citrusy насчитывает 100 строк ответов + 20 строк вопросов + 1 строку викторины.
У вас должно быть 3 таблицы: quizzes, questions и answers. questions имеет внешний ключ для quizzes, answers имеет внешний ключ для questions.
Прочтите руководство по нормализации базы данных.
Спасибо за отзывы ребята. Я задал этот вопрос, поскольку думаю, что, если у меня есть 10000 тестов, внезапно это 1 миллион строк, и я могу столкнуться с проблемами производительности. Пока то, что у меня есть, является наиболее эффективным вариантом, это нормально.
Нормализация помогает повысить производительность, а также изучить общие передовые методы проектирования баз данных. Я настоятельно рекомендую прислушаться к совету @Barmar.






При использовании механизма InnoDB по умолчанию - одна строка добавляет служебные данные размером около 20 байт. Это около 20 МБ на миллион строк, что для современного оборудования - пустяк, если хорошо организовано и проиндексировано. У вас все будет в порядке, даже если вы используете смартфон в качестве сервера.
Однако вы должны использовать по крайней мере одну таблицу для каждой сущности. Тесты, вопросы и ответы - это разные сущности, поэтому у вас должно быть как минимум три таблицы, связанные внешними ключами.
Вот пример нормализованной схемы:
create table quizzes(
quiz_id int unsigned auto_increment primary key,
title varchar(255)
);
create table questions (
question_id int unsigned auto_increment primary key,
quiz_id int unsigned not null
title varchar(255),
foreign key (quiz_id) references quizzes(quiz_id)
);
create table answers (
answer_id int unsigned auto_increment primary key,
question_id int unsigned not null
title varchar(255),
foreign key (question_id) references questions(question_id)
);
Можете ли вы поделиться схемой своей таблицы? Я не уверен, как вы получаете 131 строку за одну викторину, поскольку 20 * 5 - это всего лишь 100, и из вашего сообщения не ясно, как настраивается db.