Kill-Me Pkz-Katy
Гуру
(3975)
5 дней назад
Для организации таблицы с дружественными связями в базе данных можно использовать подход с двумя полями для идентификаторов пользователей. Таким образом, можно создать таблицу, которая будет хранить пары пользователей, состоящих в дружбе. Примерная структура таблицы может выглядеть так:
### Таблица: **friends**
| id (PK) | user_id_1 | user_id_2 | статус |
|---------|-----------|-----------|--------|
| 1 | 101 | 102 | активен|
| 2 | 103 | 104 | активен|
| 3 | 101 | 103 | удален |
- **id (PK)**: уникальный идентификатор записи.
- **user_id_1**: идентификатор первого пользователя.
- **user_id_2**: идентификатор второго пользователя.
- **статус**: может быть значением типа "активен", "удален" и т.п. — показывает статус дружбы.
### Принципы:
1. **Не дублировать записи**: В этой таблице важный момент — для каждой пары пользователей должна быть только одна запись. То есть если **user_id_1 = 101** и **user_id_2 = 102** есть запись, то не должно быть записи **user_id_1 = 102** и **user_id_2 = 101** (они взаимозаменяемы).
2. **Можно добавлять статус** дружбы, чтобы отмечать, например, заблокированные или удаленные связи.
3. **Запросы**: Чтобы узнать, кто является другом пользователя, нужно будет делать запросы, например, так:
- **Поиск друзей пользователя (например, user_id = 101)**:
SELECT user_id_2 FROM friends WHERE user_id_1 = 101 AND статус = 'активен'
UNION
SELECT user_id_1 FROM friends WHERE user_id_2 = 101 AND статус = 'активен';
Это обеспечит возможность отслеживания взаимных дружеских связей.
V̲i̲s̲t̲a̲s̲t̲e̲r̲
Искусственный Интеллект
(272457)
5 дней назад
При небольшом количестве пользователей и связей можно использовать таблицу связей, как выше указали. При тысячах пользователей или особенно если все между собой дружат и образуют миллионы записей для связи, то лучше использовать битовую строку (Bitset) или даже блоки битовых строк. Это дает огромную экономию на одну связь и высокую скорость (например для вывода кто из друзей онлайн).