Хранение личной информации пользователя. PHP

262
18 июля 2017, 18:48

Как хранить дополнительную информацию о пользователе?

НЕ login, email і т.д., А например: Мои увлечения, Мой любимый сериал, Статус пользователя (Пример:"У меня отличное настроение!"), дату рождения, город, страну.

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

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

 id_user | Мой любый случай в жизни          | ... | ... | ... | 
 ---------------------------------------------------------------  
       1 | Однажды я написал "hello, world!" | ... | ... | ... | 

В общем, кроме вопроса выше, как мне объединить такие таблицы?

Answer 1

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

Довольно интересный способ хранения информации в БД, которая не участвует в WHERE запросе.

id | date      | login  | password | lname  | sname  | fname   | info
----------------------------------------------------------------------
int| timestamp | varchar| varchar  | varchar| varchar| varchar | BLOB

в поле info хранится обычный JSON:

{"serial":"Doctor Who", "music":"Альянс - На заре", "food":"Курица"}

Преимущества очевидны:

  • Не нужны куча таблиц и связей

  • Простые запросы на выборку

  • JSON легко распарсить

Недостатки:

  • Сложно и муторно сделать выборку, например, выбрать всех у кого любимый сериал такой-то.
Answer 2

Для этого обычно делаются вертикальные таблицы. Структура у них такая:

table (id, key, value)

При необходимости, их связывают с различными сущностями - можно сделать так:

table (id, user_id, key, value)

Также key можно вынести в отдельную таблицу, чтобы пользователи могли юзать уже существующие ключи. Т.е.:

key (id, title)
table (id, user_id, key_id, value)

В итоге получается такие таблицы:

Table: 
id | user_id | key_id | value
1  | 1       | 1      | Все хорошо
Key:
id | title
1  | Статус

В SQL данные можно получить одним запросом, используя JOIN:

SELECT * FROM table AS t (INNER, LEFT) JOIN key AS k WHERE k.id = t.key_id

P.S. Прочитай про нормализацию/денормализацию БД, а также про отношения один-ко-многим, многие-ко-многим

Answer 3

В зависимости от функционала данные также можно хранить сериализованных переменных.

К примеру делаешь объект пользователя, например $user->status="Отличное настроение", затем выполняешь serialize($user) и заносишь это в БД. Обратная операция выполняется через unserialize.

Также стоит посмотреть на JSON

READ ALSO
Почему AJAX не отправляет данные?

Почему AJAX не отправляет данные?

У меня простой ajax запрос который должен отправлять input на сервер через сервлет не перезагружая страницуНо сервер не получает данные

263
Как запустить тест с maven?

Как запустить тест с maven?

Добрый день, пытаюсь запустить тест командой

368
Реализовать поиск на андроид [требует правки]

Реализовать поиск на андроид [требует правки]

Как реализовать поиск, есть массив с заголовками книг, поле для ввода текста, при вводе пары букв должны выводиться совпадения

279
Поиск картинки через google-api-services-customsearch

Поиск картинки через google-api-services-customsearch

Я делаю приложение на JavaFX и мне требуется получить озображение по поисковому запросуВыполнять поиск в google через java можно через google-api-services-customsearch,...

269