[PHP] Array, wątpliwość dot. optymalności rozwiązania


(Cobra000) #1

Witam, o co chodzi: buduję stronę opartą o $_GET, pobieram do zmiennej numer artykułu z parametru w adresie i chciałbym na podstawie tegoż numeru pobierać z tablicy dodatkowe informacje o artykule (z jakiego działu pochodzi, jaki ma tytuł, jaki jest jego czas ekspozycji itp). Moje pytanie brzmi następująco: Czy jeżeli artykułów nazbiera się 10000, a userów na stronie nie będzie brakować to czy serwer nie będzie się pocił przy przetwarzaniu tak niemałej tablicy? czy może istnieje inne rozwiązanie (np. include z plików tekstowych - wtedy serwer nie zaśmieca sobie pamięci całą tablicą). Proszę o sugestie.


(Sawyer47) #2

Bazy danych: http://pl.wikipedia.org/wiki/Lista_syst ... ami_danych


(Cobra000) #3

Aleś mi odpowiedział, mam ograniczoną bazę danych na serwerze, poza tym pojęcie o odczycie z mysql przez php też mam niewielkie, musiałbym się podszkolić, chwilowo pozostaje mi zrobić to bez bazy, być może zrobię migrację do mysql w swoim czasie. Pytanie pozostaje bez odpowiedzi.


(kalamita) #4

Serwer MySQl jest dość szybkim serwerem bazodanowym, niemniej jednak przy dużej ilości połączeń musi dzielić czas pomiędzy użytkowników. Dokładne dane co do szybkości i przeprowadzonych testów znajdziesz pewnie w necie

Jeżeli zapytanie do bazy danych jest poprawnie napisane i zoptymalizowane to przy 10000 rekordów bazy czas odczytu rzędu milisekund (dla pojedynczego zapytania - a więc i użytkownika ) Tak więc spokojnie możesz trzymać dane o artykułach w bazie danych, musisz jedynie na bieżąco kontrolować i sprawdzać szybkość wykonania zapytań do serwera bazodanowego.

klucz do sukcesu, to nie szybkość serwera i przepustowość łącza a poprawnie napisane i zoptymalizowane zapytanie.


(Karol Piatek) #5

@cobra000cobra

To już do wyboru.

Silnik bazodanowy - kwestia zapoznania się - tak jak wspomniał kalamita, najpopularniejszą

obecnie jest MySQL, chociaż też Postgresql jest niemniej ciekawą alternatywą.

Są to tzw. bazy relacyjno-obiektowe, gdzie głównie powinieneś zwrócić

uwagę na obsługę tzw. transakcji,

czyli wysyłasz zapytanie modyfikujące (UPDATE,INSERT, DELETE)

i jeżeli coś nie zadziała, masz możliwość cofnięcia zmian.

Wygląda to w ten sposób, w formie pseudocodu.

//$db nasze połączenie do bazy)

try{

    //rozpoczęcie transakcji

    $db->BeginTrans();

    $db->Execute("INSERT INTO articles articleId, articleSubId VALUES ?,?", array(1,80) );


    //zatwierdzenie zmian

    $db->CommitTrans();

}

//tutaj przechwyciliśmy wyjątek dla bazy danych

catch(DBException $db){

    $db->RollBackTrans();

}

W MySQL ENGINE=InnoDB obsługuje transakcje,

w Postgresql jest zintegrowane,

ale też niektóre firmy oferują hosting tzw baz obiektowych typu MongoDB.

Też zależy do czego przygotowujesz portal.

W przypadku baz relacyjnych również korzystaj z tzw. Prepared Statements,

czyli kompilowaniu zapytań na język zrozumiały dla bazy danych przed ich wysłaniem,

  • daje to możliwość zabezpieczenia się przed niektórymi atakami SQL Injection

oraz poprawia wydajność w komunikacji z bazą danych. :wink:

Karol

p.s. Jeżeli korzystasz z php5, zacznij wykorzystywać klasy PDO do komunikacji z bazami danych.

Również warto przy okazji poczytać o projektowaniu i optymalizacji baz danych

  • zakładanie indeksów na określone kolumny, dobieraniu odpowiednich typów do przechowywania

danych, optymalizacji dla 64bitowych - trochę tego jest.

Zawsze możesz z kimś się dogadać i wykupić lepszy hosting, np.: dedykowany,

gdzie sam zadecydujesz, jakie silniki bazodanowe mają być obsługiwane,

jakie programy dostępne, zależy ile możesz wydać na hosting.