Задать вопрос
Melorian
@Melorian
PHP, JAVA-разработчик

Хранение информации о пользователе

Добрый день, друзья!

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

Как обычно, видится два варианта:
1) Одна большая таблица с миллиардом столбцов под название каждого параметра. Из минусов — при добавлении новых колонок при увеличивающемся количестве пользователей будут фризы и вообще много гадостей. Из плюсов — сохранение и доступ в такую таблицу будут осуществляться быстро.
2) Одна таблица вида id-param, другая вида param_id — user_id — value. Из плюсов — безграничное расширение без задержек, из минусов — сложно потом контролировать этот зоопарк на чтение-запись.

Если копнуть настройки, например, твиттера, там любой из блоков (профиль, приватность и так далее) стучится на сохранение по одному адресу, условно, /profile/update, куда передается массив значений вида user[param_1], user[param_2] и так далее.

Собственно, вопрос — может быть, кто-то знает, какая магия может находиться на сервере в примере про твиттер, и какой вообще вариант можно выбрать из выше указанных двух, или, быть может, какой-то вообще третий, чтобы всё это красиво и, главное, быстро работало без сильных проблем?

Заранее спасибо и хорошего вечера понедельника всем!
  • Вопрос задан
  • 3437 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 6
Urvin
@Urvin
3) Данные, по которым не производится сортировок, не шибко меняются и представляют собой какие-то законченные блоки хранить в виде Json.
Ответ написан
@Dementor
программист, архитектор, аналитик
Хранение в виде ключ-значение и неопределенность в описании структуры данных — это задачи решаемые в рамках NoSQL баз данных. Посмотрите в их сторону. Только гибкость хранения оборачивается головной болью с выборками по ключевым полям, так как судя по отзывам построение индексов там, мягко говоря, не на все случаи жизни и во многих случаях прийдется делать полный перебор по базе.
Ответ написан
Комментировать
@lex_t
Я бы предложил посмотреть в сторону MongoDB
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
В первом варианте ничего «обычного» нет. Это вообще не вариант.
Если у нас действительно key-value хранилище, без вложенности и древовидности, то вполне подойдет второй.
Проблем с «контролем на чтение-запись» никаких не вижу. Уникальный ключ на юзер_айди-парам_айди должен решить все проблемы.

А вот если система должна поддерживать иерархию — к примеру, категория «хобби», к которой могут относиться сотни различных занятий — то как раз предложенная выше Монга и объединяет в себе эти два, на первый взгляд, противоречивые требования — хранение в JSON плюс выборки и сортировки.

Следует только учитывать особенности этой БД, являющиеся следствием её достоинств — поскольку у базы нет четкой структуры, то обязательно нужно хранить мета-информацию самостоятельно — поддерживать вручную список всех имеющихся в записях полей.
Ответ написан
Комментировать
kiloper
@kiloper
MongoDB
Ответ написан
Комментировать
kiloper
@kiloper
MongoDB
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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