Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: znajomi - projekt tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
zeta758
witam,

chce w projekcje zrobić możliwość dodawania do znajomych osób na portalu. Czyli np. osoba A dodaje do znajomych osobe B i dopiero jak osoba B potwierdzi, to wtedy oglądający profil osoby A będą widzieć ze w znajomych(przyjaciele) ma osobę B oraz w profilu osoby B będzie widać, że ma w znajomych osobę A.

Zastanawiam sie czy zrobić do tego tabele taką:
Kod
id   |   id_uzytkownika   |   id_przyjaciela   |   zaakceptował_uzytkownik   |   zaakceptowal_przyjaciel


tylko pojawia sie problem z wyswietlaniem znajomych, bo zarówno osoba moze być w kolumnie id_uzytkownika lub tez w id_przyjaciela

Czy moze lepiej zrobić taka tabele
Kod
id   |   id_uzytkownika   |   id_przyjaciela   |   zaakceptował_przyjaciel


i tutaj po dodawaniu do znajomych dodawane bylyby dwa rekordy (jeden dla uzytkownika, drugi dla przyjaciela), ale tutaj z kolei byloby klopotliwe sprawdzanie dwóch wierszy czy sa zaakceptowane zeby wyswietlic czy sa przyjaciółmi czy nie.

Najprosciej chodzi i o relacje przyjaciele - obustronna zgoda tak jak na naszej klasie np jest.
Kicok
A może dwie tabele? Jedna do przechowywania znajomości, druga do przechowywania zaproszeń:

connections
Kod
+------------+------------+
|  ID_user1  |  ID_user2  |
+------------+------------+
|    111     |     223    |
|     33     |     111    |
|     33     |      29    |

Indeksy na obie kolumny + UNIQUE( ID_user1, ID_user2 )

invitations
Kod
+-----------+-------------------+
|  ID_user  |  ID_invited_user  |
+-----------+-------------------+
|    111    |        9983       |
|    111    |         233       |
|     43    |        9983       |
|    111    |          17       |

Indeksy na obie kolumny + UNIQUE( ID_user, ID_invited_user )



1. Jeśli user 123 zaprasza usera 334, to dodajesz jeden wiersz do tabeli zaproszenia:
  1. INSERT INTO invitations VALUES ( 123, 334 )

2. User 123 chce zobaczyć kogo zaprosił:
  1. SELECT ID_invited_user FROM invitations WHERE ID_user = 123

3. User 334 chce zobaczyć przez kogo został zaproszony:
  1. SELECT ID_user FROM invitations WHERE ID_invited_user = 334

4. User 334 odrzuca zaproszenie od 123:
  1. DELETE FROM invitations WHERE ID_user = 123 AND ID_invited_user = 334

5. User 334 akceptuje zaproszenie od 123:
  1. INSERT INTO connections VALUES ( 123, 334 )
  2. DELETE FROM invitations WHERE ID_user = 123 AND ID_invited_user = 334

6.Wszyscy znajomi usera 123:
  1. SELECT * FROM connections WHERE ID_user1 = 123 OR ID_user2 = 123

lub:
  1. SELECT * FROM connections WHERE ID_user1 = 123
  2. UNION
  3. SELECT * FROM connections WHERE ID_user2 = 123

Tutaj musisz sobie sprawdzić przez EXPLAIN czy pierwsze zapytanie będzie korzystało z indeksów (nie jestem tego pewien)
Jeśli nie, a to drugie korzysta, to stosuj to drugie.
Jeśli nie wiesz o co chodzi stosuj to pierwsze smile.gif


Przy pobieraniu znajomości ID znajomego może pojawić się w pierwszej lub drugiej kolumnie - trzeba to sobie sprawdzić w PHP przy pomocy IF-a. W zamian za to masz oszczędność miejsca: jedna znajomość - jeden wiersz w tabeli.
mic_har
Niekoniecznie trzebato robić w php ifem. Wyobraź sobie, że musisz wyszukać wśrod znajomych wszystkich, którzy mają na przykład określoną datę urodzenia. Wtedy najlepiej potraktować wyniki wyszukiwania w znajomych jako tabelę tymczasową. Ale wtedy musisz jednym poleceniem SQL wywołać listę znajomych. Wczoraj się nad tym głowiłem (raczej niedoświadczony w tym jestem) i wymyśliłem następujące zapytanie:

SELECT IF(ID_user1 = 123, ID_user2, ID_user1) AS friend FROM connectionsWHERE ID_user1=123 OR ID_user2=123;



Teraz pobierasz jedną kolumnę - friend (alias). I możesz dodać dalsze warunki, co jest dość ważne moim zdaniem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.