PHP/Studium przypadku/System newsów: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
ChP94 (dyskusja | edycje)
m Poprawa linku Dalej
Silmethule (dyskusja | edycje)
m podświetlanie składni
Linia 1:
{{podświetl|php}}
{{prognav|PHP|phpMyAdmin|Bazy danych - Co dalej?}}
 
Linia 14 ⟶ 15:
 
Zacznijmy od tabeli kategorii:
<span>
 
<nowiki>CREATE TABLE `categories` (
`id` int(11) NOT NULL auto_increment,
Linia 21 ⟶ 22:
`news_num` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2;</nowiki></span>
 
Oprócz typowych pól informacyjnych: '''title''' oraz '''description''' (tytuł i opis), mamy też pole '''news_num''' przechowujące aktualną liczbę newsów wewnątrz kategorii. Musimy pamiętać, aby nasz system poprawnie zmniejszał i zwiększał jego zawartość w trakcie edycji i wprowadzania nowych elementów do bazy.
 
Następne w kolejności są newsy:
<span>
 
<nowiki>CREATE TABLE `news` (
`id` int(11) NOT NULL auto_increment,
Linia 37 ⟶ 38:
PRIMARY KEY (`id`),
KEY `category_id` (`category_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2;</nowiki></span>
 
Tabela zaczyna się od pól informacyjnych. Z punktu widzenia projektanta bazy najistotniejsze są jednak dwa ostatnie. '''category_id''' przechowuje ID kategorii, do której należy news; w tym miejscu tworzymy naszą relację. '''comment_num''' działa na podobnej zasadzie, jak w kategoriach. Dzięki temu nie trzeba będzie wykonywać skomplikowanych zapytań przy pobieraniu listy newsów, aby pokazać tam jednocześnie ilość komentarzy.
 
Na samym końcu zapoznamy się z tabelą komentarzy:
<span>
 
<nowiki>CREATE TABLE `comments` (
`id` int(11) NOT NULL auto_increment,
Linia 51 ⟶ 52:
PRIMARY KEY (`id`),
KEY `news_id` (`news_id`,`date`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2;</nowiki></span>
 
Zwróć uwagę, w jaki sposób założony jest podwójny indeks na pola '''news_id''' oraz '''date'''. Gdyby utworzyć tutaj dwa osobne indeksy, w zasadzie nic byśmy nie uzyskali. Popatrzmy na to tak: nigdy nie wyświetlamy wszystkich komentarzy, jakie mamy w bazie. Zawsze są one powiązane z jakimś konkretnym newsem, dlatego tak istotne jest odzwierciedlenie tego w strukturze indeksów. Przy osobnych indeksach pole '''date''' zostanie posortowane globalnie, a wybierając komentarze tylko dla pojedynczego newsa, system DB i tak będzie musiał przeskanować całą tabelę, aby je względem tejże daty wybrać.