Chcę zaprojektować stół do przechowywania relacji przyjaźni w moim projekcie internetowym
Powinien spełniać przynajmniej 4 następujące warunki:
kto wysyła prośbę o dodanie znajomego, np. (jeśli A TO B to ta kolumna będzie A)
którzy otrzymają prośbę o dodanie znajomego, np. (jeśli A TO B to ta kolumna będzie B)
aktualny status np. (0 oznacza odrzucone, a 1 oznacza zaakceptowane lub 2 oznacza nieprzetworzone
nasz związek partnerski jest dwustronny
Jeśli ktoś z was ma takie doświadczenie, wszelkie sugestie są mile widziane
mój obecny projekt (obecnie wydaje mi się zły) jest taki, to są kolumny
frienshipId
fromUserId
toUserId
status
requestTime
database-design
Cześć 福气 鱼
źródło
źródło
Odpowiedzi:
Stworzyłbym stół podobny do tego, który masz. Używam typów danych i składni programu SQL Server, może być konieczne dostosowanie w zależności od platformy.
Indeksowanie stołu będzie miało kluczowe znaczenie, gdy stół wzrośnie do dziesiątek i setek milionów.
źródło
Na PostgreSQL:
Aby wyświetlić listę przyjaźni, zobacz:
Możesz go używać w następujący sposób:
źródło
Co sprawia, że uważasz, że twój obecny projekt jest zły? Oto tabela tworzenia dla Oracle:
Jeśli bazą danych jest Oracle, możesz rozważyć zaindeksowanie wirtualnej kolumny, która ograniczy dane do wpisów potrzebnych dla poszczególnych zapytań. Na przykład możesz mieć wirtualną kolumnę o nazwie AcceptedFromUserId, która korzysta z funkcji DECODE (StatusId, 1, FromUserId, NULL). Indeks zawierałby tylko AcceptedUserIds, a zatem byłby mniejszy niż indeks dla wszystkich UserID. Jeśli regularnie czyścisz odrzucone żądania, indeksowana wirtualna kolumna na PendingToUserId może być bardziej przydatna.
Alternatywą dla partycjonowania byłoby podzielenie tabeli na StatusId.
Jeśli nie potrzebujesz wielu zaproszeń do znajomych między tymi samymi użytkownikami w tym samym czasie, możesz porzucić FriendId, używając FromUserId, ToUserId i StatusId jako klucza podstawowego. W takim przypadku należy również rozważyć uczynienie tabeli tabelą zorganizowaną według indeksu.
źródło
Schemat:
Z PHP:
źródło
friends
definicja tabeli jest podejrzana o błąd składniowy.)