@Vadim1899

Как правильнее хранить друзей и контакты в бд?

Привет! Есть такое приложение с базой mysql:
- Пользователь A регистрируется на сайте, импортирует свою записную книжку
- Если друг B из записной книжки регистрируется в приложении, то пользователю A придет уведомление вида "Твой контакт зарегистрировался в приложении! Скорее добавляй его в друзья"
- Пользователь A может отправить заявку в друзья пользователю B

С организацией друзей все плюс минус понятно - таблица friendships: id, date, userId, friendId, canWrite. При добавлении друга в эту таблицу сразу добавляется две записи: для пользователя A и для пользователя B.

А как лучше хранить список контактов в бд? Первое что пришло в голову - таблица contacts: id, date, userId, friendPhoneNumber, но смущает вот что:
1. 10.000 пользователей импортируют свои 100-200 контактов - в бд уже будет >1 млн записей
2. Если строк будет очень много, то будет ли тормозить обычный select? на userId и phoneNumber будут индексы

Что привлекает:
1. простой селект вида select userId from contacts where phoneNumber = '...', который позволит быстро получить всех юзеров, у которых есть нужный контакт

Поискав решения узнал, что в posgtresql есть тип колонки — массив. На первый взгляд это кажется хорошим решением: прям в таблице user храним contacts: varshar[], но нет уверенности как быстро будет осуществляться селект юзеров, у который есть определенный контакт.

Может есть еще какие-то оптимальные решения? Строгих ограничений по бд нет, можно с mysql уйти в postgresql, например
  • Вопрос задан
  • 141 просмотр
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
Первое что пришло в голову - таблица contacts
норм

1. 10.000 пользователей импортируют свои 100-200 контактов - в бд уже будет >1 млн записей
это мало

Если строк будет очень много, то будет ли тормозить обычный select? на userId и phoneNumber будут индексы
с большой вероятностью не будет, но обычно если возникает вопрос, собирают тестовый стенд и проверяют самостоятельно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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