Мой user
стол что-то вроде:MySQL Friend Таблица Двусторонний Уникальный индекс
Table: users
UserID Username
1 'Tom'
2 'x1x'
3 'Google'
И мой текущий дизайн DB для моей friends
таблицы:
Table: user_relationships
relationship_id to_user_id by_user_id status date
1 1 2 1 CURDATE()
2 1 3 2 CURDATE()
3 3 2 3 CURDATE()
Столбец статус:
1 - Friends
2 - Pending Request
3 - Ignored
И целью столбца даты является определение того, как долго пользователь A и пользователь B были друзьями. Дело в том, что когда Tom (id: 1) становится друзьями с x1x (id: 2), Том не должен отправлять запрос другу x1x (id: 2). Точно так же Том (id: 1) не должен отправлять друга в Google (id: 3). (вместо этого следует дать возможность принять). Я поставил уникальное ограничение на to_user_id
и by_user_id
, но единственным ограничением является не обоими способами, как в:
Table: user_relationships
relationship_id to_user_id by_user_id status date
1 1 2 1 CURDATE()
2 1 3 2 CURDATE()
3 3 2 3 CURDATE()
4 2 1 2 CURDATE()
Отношения ID 4 НЕ должно быть разрешено, и запрос должен быть чем-то вроде
INSERT INTO ... ON DUPLICATE KEY UPDATE relationship_id = relationship_id
Но опять же, единственное ограничение - это не два пути. Как я могу это сделать? Я действительно не хочу, чтобы сделать
SELECT .... WHERE to_user_id = x AND by_user_id = y OR to_user_id = y AND by_user_id = x
Чтобы проверить наличие и затем INSERT
на его основе. Есть ли систематический недостаток в моей конструкции БД для этого, что может вызвать эту проблему?
Могу я просто иметь: to_user_id, from_user_id, используя ваш (гениальный) рекомендуемый нижний идентификатор слева и больше справа, чем другой столбец с именем sent_id, чтобы идентифицировать пользователя, выполнившего запрос? Или мне нужно создать другую таблицу с connection_id и sent_id? –
@PhilipTsang Конечно. Чтобы получить уникальную ключевую работу, вам нужно использовать два столбца с отсортированными идентификаторами. Все остальное открыто для вас. – AbcAeffchen