Какая схема таблицы базы данных для хранения данных опроса?
Я занимаюсь разработкой программного обеспечения для проведения онлайн-опросов. Когда большое количество пользователей одновременно заполняют опрос, у меня возникают проблемы с обработкой записи в базу данных. Моя текущая таблица (MySQL, InnoDB) для хранения данных опроса имеет следующие столбцы: dataID, userID, item_1 .. item_n. Столбцы item_* имеют разные типы данных, соответствующие типу данных, полученных с помощью определенных элементов. Большинство столбцов элементов имеют тип TINYINT(1), но есть также некоторые столбцы элементов TEXT. Крупные опросы могут содержать более ста элементов, что приводит к таблице с более чем ста столбцами. Пользователи отвечают около 20 пунктов в одном http посте, и соответствующая строка должна быть обновлена соответствующим образом. Пользователь может пропустить много элементов, что приводит к большому количеству значений NULL в строке.
Я рассматриваю следующее решение моей проблемы с загрузкой записи. Вместо одной таблицы с несколькими столбцами я настроил несколько таблиц, соответствующих используемым типам данных, например: data_tinyint_1, data_smallint_6, data_text. Каждая из этих таблиц будет иметь только следующие столбцы: userID, itemID, value (столбец значения имеет тип данных, соответствующий его таблице). Для одного сообщения http, например, с 20 элементами, мне может понадобиться создать 19 строк в data_tinyint_1 и одну строку в data_text (вместо обновления одной большой строки с большим количеством столбцов). Однако для каждого элемента мне нужно определить его тип данных (с помощью двух объединений таблиц), чтобы я знал, в какой таблице создать новую строку. Мой код приложения, основанный на Zend Framework, станет более сложным с этим подходом.
Мои вопросы:
- Будет ли мое решение лучше для большой нагрузки записи?
- У вас есть лучшее решение?
2 ответа
Поскольку вы дошли до того, что абстрагируете эту схему для имитации фактических типов данных, может быть понятно, что вместо этого вам следует просто создавать новые наборы таблиц для каждого опроса. Преимущество будет в том, что блокировка уменьшится, и вы можете изолировать тяжелые нагрузки от внешних машин, если нагрузка станет невыносимой.
Таким образом, структура базы данных с одним опросом может более точно отражать ваши реальные условия и обработчики ввода данных. Это должно заставить ваши головные боли абстракции уйти.
Нет ничего плохого в создании таблиц на лету. В некоторых конфигурациях мягкое разбиение является предпочтительным.
Похоже, очевидным решением было бы использовать базу данных документов для быстрой записи, а затем асинхронно вводить массовые ответы на MySQL, используя cron или что-то в этом роде. Вы можете создать представление в базе данных документов для быстрой статистики, но разрешить фильтрацию и другие сложные вещи только в MySQ, если вы не являетесь поклонником СУБД документов.