Moim zdaniem najlepiej zrobić dwie tabele:
znajomi [id_uzytkownika, id_znajomego]
zaproszenia [id, id_zapraszajacego, id_zapraszanego, stan_dla_zapraszajacego, stan_dla_zapraszanego, stan_zaproszenia]
przy czym:
- zapraszający przechowuje zaproszenie w swojej skrzynce nadawczej: stan_dla_zapraszajacego='wysłane',
- zapraszający zaproszenie usunął: stan_dla_zapraszajacego='wykasowane',
- zapraszany zaproszenia jeszcze nie przeczytał: stan_dla_zapraszanego='nowe' oraz stan_zaproszenia='oczekuje',
- zapraszany zaproszenie usunął, chociaż nie zaakceptował, a może nawet nie przeczytał: stan_dla_zapraszanego='wykasowane' oraz stan_zaproszenia='odrzucone',
- zapraszany zaproszenie przeczytał, ale jeszcze nie zaakceptował: stan_dla_zapraszanego='przeczytane' oraz stan_zaproszenia='oczekuje',
itd...
Cytat(zend @ 26.03.2010, 22:45:57 )

Na początku musimy zauwarzyć, że dane itak będą nam się dublować
Dane wcale nie muszą się dublować. Wszystko można sprawdzić za pomocą prostego select-a:
SELECT * FROM znajomi WHERE (id_uzytkownika=moje_id AND id_znajomego=czyjes_id) OR (id_uzytkownika=czyjes_id AND id_znajomego=moje_id)
Dane w tabeli zaproszenia możemy przechowywać, albo usuwać. Przechowywać
musimy wtedy, gdy chcemy, aby użytkownik który zaproszenie od "ktosia" odrzucił, nie mógł tego "ktosia" zaprosić.