Предположим, что я хочу хранить отношения между пользователями моего приложения, как и Facebook, как таковой.
Это означает, что если A является другом (или некоторым отношением) B, то B также является другом A. Чтобы сохранить эти отношения, я в настоящее время планирую хранить их в таблице для отношений следующим образом
UID FriendID
------ --------
user1 user2
user1 user3
user2 user1
Однако я столкнулся с двумя вариантами:
- Типичный случай, когда я буду хранить как
user1 -> user2
, так иuser2->user1
. Это займет больше места, но (по крайней мере, в моей голове) требуется только один проход по строкам для отображения друзей конкретного пользователя. - Другой вариант - сохранить либо
user1->user2
ORuser2->user1
, и всякий раз, когда я хочу найти всех друзейuser1
, я буду запрашивать в обоих столбцах таблицы, чтобы найти друзей пользователя. Это займет половину пространства, но (опять же, по крайней мере, в моей голове) в два раза больше времени.
Прежде всего, подходит ли мое рассуждение? Если да, то есть ли какие-то узкие места, которые я забываю (с точки зрения масштабирования/пропускной способности или чего-то еще)?
В принципе, есть ли какие-то компромиссы между ними, кроме перечисленных здесь. Кроме того, в промышленности предпочтительнее другого?