Задать вопрос
devspec
@devspec
Помогло? Отметь решением

Какую выбрать технологию для хранения и выборки больших данных?

Всем привет!

Есть задачка следующего вида.
Есть много юзеров (десятки тысяч). Для каждого юзера необходимо хранить некие короткие текстовые данные. Для одного юзера может храниться 10 строк, для другого 10000, для третьего - миллион - для каждого юзера количество хранимых строк разное. Строки могут повторяться между юзерами.
Вопрос: какую из современных bigdata-технологий стоит выбрать для хранения этой информации, при условии, что:
1. Доступ будет осуществляться из c# - следовательно, нужен драйвер для c#
2. Поиск будет происходить по юзеру - то есть запрос вида "выбрать все строки, принадлежащие юзеру Х" будет наиболее частым запросом.
3. Поиск и выборка должны происходить максимально быстро (миллисекунды), независимо от количества юзеров и строк в базе.
  • Вопрос задан
  • 561 просмотр
Подписаться 5 Простой 19 комментариев
Решения вопроса 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Никакую. К big data указанные объемы отношения не имеют.
Подойдет любая СУБД, так что можно выибарть ту, которая больше знакома.

Тем более, что
Строки могут повторяться между юзерами.

Т.е. в нормализованном виде это будет занимать еще меньше места.

Лично мне куда интереснее другой вопрос. Что будет делать система с миллионом строк после запроса
"выбрать все строки, принадлежащие юзеру Х"
.
Ответ написан
@hx510b
"Я знаю, что ничего не знаю"
10тыс пользователей * 1 млн строк по 200 байт = 2ТБ - максимальный размер базы - великовато для MySQL, но работать будет даже в лоб.
Раз строки повторяются, то нужно сделать словарь строк, и оперировать уже id строки.
Раз таблица пользователь-строки может оказаться очень длинной и ее изменение будет приносить большие задержки. То есть смысл резделить таблицу с информацией о строках пользователей на несколько таблиц (партиционирование), разделив весь пул пользователей по конкретным таблицам, чем больше таблиц - тем легче будет проходить обновления.
итого имеем такую структуру:

таблица users,
в которой id пользователя, некое внешнее описание пользователя, номер/имя таблицы с данными

таблица dict,
в которой храним уникальные строки и их id

пачка таблиц usersdata1...N,
в которых храним id пользователя и id строки, если у пользователя строки могут повторяться - то уникальный key id, чтобы хранить дубликаты строк и вытягивать их в порядке key id
чем больше N - тем веселее будут проходить изменения.

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

Потом такую базу можно перенести на raid из ssd, чтобы чтение происходило с минимальными задержками на чтение.
Если захочется еще повысить производительность, то userdataN можно размазать на разные хосты. При этом таблицы dict и users реплицировать между хостами средствами mysql.
Можно и миллионы пользователей так обслуживать, имя соответствующий парк серверов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы