Zakładam, że że jeden użytkownik może mieć tylko i wyłącznie jedną tablicę i jedna tablica może należeć tylko i wyłącznie do jednego użytkownika. I nigdy się to nie zmieni. To ważne bo jeśli jest szansa, że któryś z tych dwóch warunków się zmieni, to warto już teraz przyjąć inną strukturę danych.
Jeśli chodzi o tabele mediów - "
galerie", "
filmy", itd. to jest OK.
Jeśli chodzi o tablice użytkowników: zamiast przechowywać w jednej tabeli wszystkie informacje o powiązanych mediach, zrób indywidualne tabele dla każdego: "
tablice_galerie", "
tablice_filmy", itd. W każdej z tych tabel będziesz przechowywał informację o tym, która galeria/film/itd jest przypięta do której tablicy (do którego użytkownika), np.:
Kod
tabela "tablice_galerie"
id_uzytkownik | id_galeria | data_przypiecia | komentarz
W momencie tworzenia nowego wpisu o galerii w tabeli "
galerie" musisz utworzyć też wpis w tabeli "
tablice_galerie". W ten sposób, domyślnie, autor wpisu o galerii będzie miał przypiętą galerię do swojej tablicy. Galerię istniejąca w systemie będą mogli dodawać do swoich tablic inni uzytkownicy - będziesz dodawał kolejny wpis z takim samym identyfikatorem galerii i identyfikatorem osoby dodającej. W ten sposób pozwolisz odpiąć galerię od tablicy nawet autorowi wpisu o galerii i będziesz miał możliwość pokazywania galerii znajomym znajomych itd.
Jak pokazać galerie znajomych na swojej tablicy? Przeszukując tabelę "
znajomi". Z tą tabelą jest taki problem, że nie wiadomo w której kolumnie jest id aktualnie zalogowanego użytkownika. Ale to tylko mała niedogodność, z którą można sobie łatwo poradzić. Czyli, po pierwsze, potrzebujemy id użytkowników, którzy są znajomymi aktualnie zalogowanego użytkownika id X:
Kod
SELECT id_user_2 AS znajomy FROM znajomi WHERE id_user_1 = X
UNION -- "union" elegancko połączy oba zapytania bez duplikatów
SELECT id_user_1 AS znajomy FROM znajomi WHERE id_user_2 = X
W wyniku dostaniesz kolumnę o nazwie "
znajomy" wypełnioną identyfikatorami znajomych aktualnie zalogowanego użytkownika. Wyszukanie galerii obecnych na ich tablicach jest czystą formalnościa:
Kod
SELECT id_galeria
FROM tablice_galerie
WHERE id_uzytkownik IN (
SELECT id_user_2 AS znajomy FROM znajomi WHERE id_user_1 = X
UNION
SELECT id_user_1 AS znajomy FROM znajomi WHERE id_user_2 = X
)
W wyniku dostaniesz identyfikatory galerii przypiętych do tablic wszystkich znajomych aktualnego usera. No OK, ale co jeśli niektóre z tych galerii są też przypięte do tablicy aktualnego usera? Nie chcemy ich dwa razy pokazywać, no nie? Do zapytania wyciągającego identyfikatory użytkowników dodajemy id aktualnego usera:
Kod
SELECT id_galeria
FROM tablice_galerie
WHERE id_uzytkownik IN (
SELECT id_user_2 AS znajomy FROM znajomi WHERE id_user_1 = X
UNION
SELECT id_user_1 AS znajomy FROM znajomi WHERE id_user_2 = X
UNION
SELECT X
)
No i mamy identyfikatory wszystkich galerii, które aktualny user powinien zobaczyć na swojej tablicy: zarówno tych przypiętych do swojej tablicy jak i tych przypietych do tablic swoich znajomych; bez duplikatów. Do tego wyniku dodamy dane galerii:
Kod
SELECT
tg.id_galeria,
g.id_uzytkownik AS id_autora_galerii, -- "autora" w sensie twórcy wpisu o galerii
g.data_przypiecia,
g.komentarz AS komentarz_autora_galerii -- "autora" w sensie twórcy wpisu o galerii
FROM tablice_galerie tg
JOIN galerie g ON g.id_galeria = tg.id_galeria
WHERE tg.id_uzytkownik IN (
SELECT id_user_2 AS znajomy FROM znajomi WHERE id_user_1 = X
UNION
SELECT id_user_1 AS znajomy FROM znajomi WHERE id_user_2 = X
UNION
SELECT X
)
W wyniku otrzymasz takie zestawienie:
Kod
id_galeria | id_autora_galerii | data_przypiecia | komentarz_autora_galerii
------------+-------------------+---------------------+--------------------------
23 | 483 | 2012-03-12 12:12:32 | Fajowa
287 | 12 | 2012-01-26 06:30:43 | Polecam
35 | 12 | 2012-01-29 09:45:01 | Polecam też
To są same galerie. Podobnie robisz z filmami i innymi mediami. Poszczególne wyniki ładujesz do tablicy w PHP i tam sortujesz i obrabiasz.