2012-03-17 4 views
0

Предположим, что я хотел бы хранить голоса для опросов в базе данных mysql.Как хранить конкретные (опросы, например) данные в базе данных MySQL?

Насколько я знаю, у меня есть два варианта:

. Создание одной таблицы (скажем голосов) с полями, как poll_id, user_id, selected_option_id, vote_date и так далее ..

. Создайте новую базу данных для голосов (допустим, votes_base), и для каждого опроса добавьте таблицу к этой базе (таблица, состоящая из идентификатора опроса в названии), скажем poll [id of the poll] ,

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

Проблема с второй вариант Я не уверен, что это правильное решение с точки зрения правил программирования. Но я уверен, что с этим вариантом будет (намного?) Быстрее найти все голоса для какого-то опроса.

Или, может быть, есть лучший вариант?

ответ

2

Ваш первый вариант - лучший вариант. Это структурно более здорово. Миллионы строк в таблице не проблема MySQL. Новая таблица за опрос - это антипаттерн.

EDIT для первого комментария:

Даже за миллиард или больше голосов, MySQL должен обрабатывать. Здесь указаны ключевые слова. В чем разница между одной базой данных в 100 раз той же таблицей или одной таблицей в 100 раз больше строк?

Технически второй вариант также работает. Иногда это может быть даже лучше. Но мы часто видим это:

  • Вместо одной таблицы, пользователи, с 10 колоннами
  • сделать 100 таблиц, users_uk, users_us, ... в зависимости от того, где пользователи находятся.

Отлично, нет? Работает, да? Ну, это так, пока вы не захотите выбрать всех пользователей-мужчин или присоединиться к таблице пользователей на другую таблицу. У вас будет огромный UNION, и вы даже не будете знать таблицы заранее.

Одна большая таблица пользователей с соответствующими индексами, лучше. Если он становится слишком большим для вашей симпатии (или вашего диска), вы можете начать с PARTITIONING: у вас все еще есть преимущество одной таблицы, но разделы хранятся в разных местах.

Теперь, с вашими опросами, таких запросов может не случиться. В этом случае одна большая таблица InnoDB или 1000 маленьких таблиц могут работать, но первый вариант намного проще в программировании и не имеет недостатков по второму варианту. Зачем выбирать второй вариант?

+0

Но что, если у меня есть, например. миллиарда (или даже больше) голосов? Разве не намного быстрее просто выбрать каждую строку таблицы с x строк вместо поиска 1 миллиарда строк для этих x строк? Честно говоря, я не вижу веских оснований не использовать второй вариант. Какие проблемы могут возникнуть? – Jack

+0

Хороший вопрос. Я отредактировал свой ответ. Я изменю вопрос: почему бы не использовать хороший и чистый первый вариант? Для InnoDB нет проблем с большими столами. – Konerak

0

Первый вариант лучше.И вы можете архивировать таблицы через некоторое время, если вы не собираетесь их часто использовать

1

Первый вариант - это лучше, без сомнения. Просто не забудьте определить ИНДЕКСЫ для полей, которые вы будете использовать для поиска данных (например, poll_id, наверняка), и вы не столкнетесь с проблемами производительности. MySQL - это СУБД, прекрасно способная обрабатывать такое количество строк. Не волнуйтесь.