[PHP][MySQL] Lista znajomych

0

Witam

Chcę zrobić coś na kształt listy znajomych. Mam listę użytkowników i każdy z nich może do listy znajomych dodawać innych już istaniejących użytkowników.

Mam taką koncepcję:
Utworzylem tabelę znajomi

+-------------+-----------+
| uzytkownik | znajomy |
+-------------+-----------+
| Marcin | Kasia |
| Marcin | Ania |
| Kasia | Marcin |
+------------ +-----------+

Jak widać Marcin dodał do swoich znajomych dwie osoby: Kasię i Anię, Kasia w swoich znajomych ma tylko Marcina, natomiast Ania nie dodała żadnego znajomego.

Sposób bardzo prosty, jednak wyobraźmy sobie, że w bazie mamy 100 użytkowników i każdy w swoich znajomych ma dodanych wszystkich pozostałych użytkowników. Wtedy tabela będzia miała 100*99=9900 linii!

Moje pytanie brzmi następująco: czy da się utworzyć takie powiazania w bardziej 'ekonomiczny' sposób? Jeśli tak, to jakie rozwiązanie proponujecie?

Dzięki, pozdrawiam

0

inaczej to chyba tylko na indeksach:

+--+-------------+-----------+
| id | uzytkownik | znajomy |
+--+-------------+-----------+
| 1 | Ania | 0 |
| 2 | Marcin | 1,3 |
| 3 | Kasia | 2 |
+--+------------ +-----------+

0 - nie zna nikogo
1,3 - zna 1 (ania) i 3 (kasia)
2 - zna 2 (marcin)

0
AklimX napisał(a)

inaczej to chyba tylko na indeksach:

+--+-------------+-----------+
| id | uzytkownik | znajomy |
+--+-------------+-----------+
| 1 | Ania | 0 |
| 2 | Marcin | 1,3 |
| 3 | Kasia | 2 |
+--+------------ +-----------+

0 - nie zna nikogo
1,3 - zna 1 (ania) i 3 (kasia)
2 - zna 2 (marcin)

moga byc problemy z odczytaniem 1,3 no i nie wiadomo ile bedzie ten marcin mial znajomych wiec nie dasz chyba do tabeli kolumny znajomy jako typ text ?!

chyba lepiej miec dwie tabele

tabela uzytkownicy
id nazwa
1 marcin
2 ania
... ...

a pozniej
tabela znajomi
id_uzytkownika id_znajomego
1 2

i juz wiadomo ze uzytkownik od id = 1 (marcin) ma znajomego uzytkownika o id = 2 (ania)

0

moga byc problemy z odczytaniem 1,3 no i nie wiadomo ile bedzie ten marcin mial znajomych wiec nie dasz chyba do tabeli kolumny znajomy jako typ text ?!

[diabel] właśnie tak chciałem zrobić :) potem dajesz explode'a i gotowe.
Jeżeli będziesz chciał np. wczytać od tyłu, czyli kto lubi Marcina, to wtedy możesz dać

SELECT ... WHERE (znajomy LIKE 2%) OR (znajomy LIKE %,2,%) 

ale nie wiem jak z wydajnością (wygeneruj sobie najgorszy przypadek (wszyscy znają wszystkich) i zobacz ile mu to zajmie)

0

Albo ewentualnie spróbuj poszukać informacji o XFN - może ci się przydać.

0

Najlepsze jest chyba rozwiązanie Angusa. Standardowa relacja wiele do wielu. Wszelkie inne kombinacje (z polem Text itp.) mogą tylko na pierwszy rzut oka wydawać się efektywniejsze. W praktyce baza danych najszybciej upora się z taką relacją.

0

no i przede wszystkim oszczednosc miejsca i czasu :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1