Вставка ~ 4K строк в БД для каждого пользователя - дизайн и производительность - PullRequest
0 голосов
/ 04 июня 2018

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

Основная таблица БД, Слово , содержит ~ 4K различных строкслов.Таблица Label содержит 3 метки.-> Таблица Word-Label (которая содержит 3 столбца: word_id, label_id, user_id) добавит 4K строк на пользователя (давайте предположим, что все слова начинаются с некоторой предопределенной метки, когда пользователь регистрируется всистема).

Проблема в том, что таблица будет расти очень быстро.1: 4000 (пользователь / строка), на мой взгляд, плохо.

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

Кроме того, я использую Spring & Hibernate, а вставки 4K после первой регистрации пользователя довольно сложны и требуют много времени.время.

Я могу рассмотреть какое-то решение NoSQL или другой инструмент, кроме Hibernate, но я намерен использовать Spring & Java - поэтому предложите что-то правильно.

Будетрад за вашу помощь здесь

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

вы можете закодировать пользовательскую карту отклика в битовый массив 4000 записей или строку, если вам не нужны реляционные возможности базы данных

, тогда это будет одна запись на пользователя.

create table user_words (userid int, wiorddata text);
insert into user_words values (1,'YNYYNmmmYY'/* ... */ );

ваше приложение должно иметь список слов и знать, к какому из символов относится каждый символ.

0 голосов
/ 04 июня 2018

Нет проблем с размером данных.У вас может быть проблема с Hibernate, но это другая проблема.

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

insert into userLabels (userId, wordId, label)
    select :userId, w.wordId, <default label>
    from words w;

Я был бы удивлен, если бы это заняло больше секунды или двух.

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

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

0 голосов
/ 04 июня 2018

Первый подход, вы просто добавите новую строку в метку слова для пользователя после действия.Таким образом, не у каждого пользователя, вероятно, будет 4 тыс. Строк в этой таблице.Теперь, когда ваш запрос к базе данных и другие вещи, связанные с этой функциональностью, станут проблемой (узким местом), попробуйте исправить проблему и повысить производительность.

В базах данных SQL можно использовать множество приемов повышения производительности.Например, вы написали о таблице на пользователя.Это не совсем лучшее решение, в следующем примере в mysql вы можете создавать таблицы с именами, и они будут обрабатываться как одна таблица, но с улучшением производительности.

Второй подход, для этого типа данных, конечно, требует некоторого NoSQLкак MongoDB будет работать отлично.

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