Как сохранить двунаправленные отношения в СУБД, такой как MySQL?

Предположим, я хочу сохранить отношения между пользователями моего приложения, как в Facebook, как таковой.

Это означает, что если Aявляется другом (или некоторым родственником) B, то Bтакже является другом A. . Чтобы сохранить эти отношения, я в настоящее время планирую хранить их в таблице для отношений следующим образом

  UID      FriendID
 ------    --------
 user1      user2
 user1      user3
 user2      user1

Однако здесь я сталкиваюсь с двумя вариантами:

  1. Типичный случай, когда я буду хранить оба user1 -> user2 и пользователь2->пользователь1. Это займет больше места, но (по крайней мере, в моей голове) потребуется всего один проход по строкам, чтобы отобразить друзей конкретного пользователя.
  2. Другим вариантом было бы сохранить либо user1->user2ИЛИ user2->user1, и всякий раз, когда я хочу найти всех друзей user1, Я буду запрашивать оба столбца таблицы, чтобы найти друзей пользователя. Это займет вдвое меньше места, но (опять же, по крайней мере, в моей голове) в два раза больше времени.

Во-первых, уместны ли мои рассуждения? Если да, то есть ли какие-то узкие места, о которых я забываю (с точки зрения масштабирования/пропускной способности или чего-то еще)?

В принципе, есть ли какие-либо компромиссы между ними, кроме перечисленных здесь. Кроме того, в промышленности один предпочтительнее другого?

14
задан marc_s 30 May 2012 в 05:08
поделиться