2015-05-27 5 views
2

Мой 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 на его основе. Есть ли систематический недостаток в моей конструкции БД для этого, что может вызвать эту проблему?

ответ

1

Если вас интересует только «существует связь между двумя пользователями», вы можете отсортировать идентификаторы пользователей таким образом, чтобы to_user_id был меньшим ID, а by_user_id - это более высокий идентификатор или наоборот.

Если вас интересует «кто добавил кого», вы можете добавить два новых столбца user_1 и user_2 и выполнить то, что я описал выше, используя два новых столбца.

Если два идентификатора сортируются, единственный уникальный ключ делает то, что вы хотите.

Вы можете использовать функцию MySQL GREATEST() и LEAST(), чтобы упростить ваши запросы на вставку.

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

+0

Могу я просто иметь: to_user_id, from_user_id, используя ваш (гениальный) рекомендуемый нижний идентификатор слева и больше справа, чем другой столбец с именем sent_id, чтобы идентифицировать пользователя, выполнившего запрос? Или мне нужно создать другую таблицу с connection_id и sent_id? –

+0

@PhilipTsang Конечно. Чтобы получить уникальную ключевую работу, вам нужно использовать два столбца с отсортированными идентификаторами. Все остальное открыто для вас. – AbcAeffchen

Смежные вопросы