Jak przechowywać dwukierunkowe relacje w RDBMS, takie jak MySQL?
Załóżmy, że chcę przechowywać relacje między użytkownikami mojej aplikacji, podobnie jak Facebook, per se.
To znaczy, jeśliA jest przyjacielem (lub jakąś relacją)B, następnieB jest również przyjacielemA. Aby przechowywać te relacje, obecnie planuję przechowywać je w tabeli relacji w następujący sposób
UID FriendID
------ --------
user1 user2
user1 user3
user2 user1
Jednak mam tu dwie opcje:
Typowy przypadek, w którym będę przechowywać obauser1 -> user2
iuser2->user1
. Zajmie to więcej miejsca, ale (przynajmniej w mojej głowie) wymaga tylko jednego przejścia przez wiersze, aby wyświetlić przyjaciół określonego użytkownika.Inną opcją byłoby przechowywanieuser1->user2
LUBuser2->user1
i ilekroć chcę znaleźć wszystkich przyjaciółuser1
, Przeszukuję obie kolumny tabeli, aby znaleźć znajomych użytkownika. Zajmie to połowę miejsca, ale (co najmniej w mojej głowie) dwa razy więcej czasu.Po pierwsze, czy moje rozumowanie jest właściwe? Jeśli tak, to czy są jakieś wąskie gardła, o których zapomniałem (pod względem skalowania / przepustowości lub czegokolwiek)?
Zasadniczo, czy są jakieś kompromisy między tymi dwoma, inne niż te wymienione tutaj. Również w przemyśle preferuje się jeden od drugiego?