Witam
Mam problem z zaprojektowaniem aplikacji a dokładniej chodzi o system powiązań.
załóżmy, że mamy jakiś obiekt np strona internetowa, której dane są zapisane w bazie, (będzie 10 000 takich obiektów a docelowo 100 000).
Są one ze sobą powiązane - średnio jedna strona do 100 innych.
na razie jest prosto, mam dwie tabeli. Jedna przechowuje dane strony druga powiązania.
i tutaj mam pytanie jakie zapytanie jest wydajniejsze przy wyświetlaniu danych powiązanych:
1.
SELECT *(jakieś dane)
FROM strona
INNER JOIN strona_strona ON strona_strona.id_str=strona.id WHERE strona.id='".$id."'
2.
SELECT *(jakieś dane)
FROM strona, strona_strona
WHERE strona_strona.id_str='".$id."'
AND strona_strona.id_str2=strona.id
sprawa się komplikuje gdy strony mają dalsze powiązania:
StronaA -> StronaB -> StronaC
logując się na stroneA chciałbym zobaczyć linki zarówno stron powiązanych (stronaB+99 inncyh) jak i stron powiązanych 2 poziomu (stronaC +99 innych)
warunek jest taki, że przeczytać informacje o linku można pod warunkiem, że ma się powiązanie z daną strona lub powiązanie 2 poziomu.
i tu jest problem bo:
1. dodając link powinienem od razu dodać do bazy powiązania, które strony będą go widziały ale wtedy szybko powstanie bardzo dużo rekordów:
100 stronA x 100 stronB = 10 000 powiązań dla jednego linku. A linków będzie wiele - nawet do 20tu na jedna stronę.
2. drugi sposób to zrobić zapytanie po wszystkie powiązane strony i powiązane z drugiego poziomu, zachować wyniki w tablicy a następnie zapytanie po linki i porownywać czy id strony pobranego linku znajduje się w tablicy i jeśli tak to wyświetlić, jeśli nie to nie wyświetlać.
Czy to będzie optymalne? Chodzi o tablice z nawet 10 000 danych i potem sprawdzanie czy dany id znajduje się w tablicy, dodatkowo po wejściu na link aby zobaczyć więcej informacji znowu musiałbym zrobić zapytanie po wszystkie powiązania (10 000) i umożliwić przeczytanie informacji tylko jeśli id znajduje się w tablicy.
3. czy da się to zrobić jeszcze w inny - bardziej optymalny sposób?