Najważniejszą częścią wszystkich systemów CMS jest baza danych. Prawidłowo zaprojektowana baza danych powinna uwzględniać możliwość rozbudowy systemu o nowe tabele. Dzięki takiemu podejściu, można projektować system w postaci modułów.
W większości przypadków bazę danych przedstawia się w postaci diagramu związku encji (ERD - entity relationship diagram). Po pierwszym uruchomieniu MySQL należy utworzyć bazę danych odpowiedzialną za zarządzanie projektem (Listing 1).
Listing 1. Polecenie tworzące bazę danych
CREATE DATABASE wiedzanaplus;
Program do komunikacji z MySQL prosi o połączenie z konkretnym użytkownikiem, do utworzenia którego służy polecenie GRANT (Listing 2). W większości projektów na localhost program korzysta z konta administratora (root), jednak można utworzyć własne konto i podpiąć do programu. Tworzenie nowego konta jest przedstawione na listingu 3. Z poziomu konta można zadawać zapytania, dopisywać dane do tabeli, kasować dane z tabeli oraz aktualizować wprowadzone wcześniej informacje. Z poziomu konta istnieje dostęp tylko do tabel w bazie danych „wiedzanaplus”.
Listing 2. Składnia polecenia GRANT
GRANT przywileje[kolumny] ON obiekt TO identyfikator_użytkownika [IDENTIFIED BY `hasło`] [WITH GRANT OPTION]
Listing 3. Polecenie odpowiedzialne za utworzenie konta użytkownika
GRANT SELECT, INSERT, DELETE, UPDATE ON wiedzanaplus.* TO wiedzanaplus@localhost IDENTIFIED BY `hasło`;
W bazie danych znajduje się dziesięć tabel:
- uzytkownicy – posiada informacje o administratorach, użytkownikach zarejestrowanych w programie (Tabela 1.);
- kontakty – przechowuje dane kontaktowe zarejestrowanych użytkowników, administratorów systemu (Tabela 2.);
- adresy – przechowuje dane dotyczące adresu zamieszkania obecnie zarejestrowanych użytkowników, administratorów (Tabela 3.);
- wojewodztwa – tabela zawierająca listę wszystkich województw (Tabela 4.);
- sekcje – tabela zawierająca wszystkie sekcje w systemie (Tabela 5.);
- kategorie - tabela zawierająca wszystkie kategorie w systemie (Tabela 6.);
- artykuly – wszystkie artykuły dodane do bazy danych (Tabela 7.);
- pola_menu – tabela zawiera wszystkie utworzone pola menu (Tabela 8.);
- typy_menu – tabela przechowuje nazwy wszystkich typów menu dostępnych w systemie np.: Menu główne, Menu górne (Tabela 9.);
- typy_pozycji_menu – tabela przechowuje typy pozycji menu, jakie mogą być utworzone w systemie np.: Artykuły => Sekcje, Pojedynczy artykuł, Łącze zewnętrzne (Tabela 10.).
Tabele 1 - 10 prezentują strukturę tabel.
Nazwa pola: | Opis: |
id_uzytkownik | Klucz główny, przydzielany automatycznie |
id_kontakt | Klucz obcy z tabeli kontakty |
id_adres | Klucz obcy z tabeli adresy |
login | Nazwa administratora, użytkownika systemu |
md5_haslo | Hasło szyfrowane algorytmem MD5 |
imie | Imię |
nazwisko | Nazwisko |
uprawnienie | Pole przechowuje numer uprawnienia przydzielony przez administratora (1, 2, 3, 4) |
konto_aktywne | Pole przechowuje datę, od kiedy konto użytkownika ma być aktywne w systemie |
data_utworzenia | Data utworzenia konta |
data_zablokowania_konta | Pole przechowuje datę, od kiedy konto użytkownika musi zostać wyłączone z systemu |
opis | Pole przechowuje dodatkowe informacje o użytkowniku np.: dlaczego jest na urlopie |
Nazwa pola: | Opis: |
id_kontakt | Klucz główny przydzielany automatycznie |
nr_tel_1 | Pole odpowiedzialne za przechowywanie numeru telefonu |
nr_tel_2 | Pole odpowiedzialne za przechowywanie dodatkowego numeru telefonu |
fax | Numer fax-u |
Adres e-mail | |
www | Adres strony internetowej |
Nazwa pola: | Opis: |
id_adres | Klucz główny przydzielany automatycznie |
id_wojewodztwo | Klucz obcy z tabeli „wojewodztwa” |
miasto | Miasto |
miejscowosc | Miejscowość |
powiat | Powiat |
kod_pocztowy | Kod pocztowy |
ulica | Nazwa ulicy |
nr_domu | Numer domu |
nr_lokalu | Numer lokalu |
Nazwa pola: | Opis: |
id_wojewodztwo | Klucz główny przydzielany automatycznie |
nazwa_wojewodztwa | Nazwa województwa |
Nazwa pola: | Opis: |
id_sekcja | Klucz główny przydzielony automatycznie |
nazwa_sekcji | Nazwa sekcji |
opis_sekcji | Opis sekcji |
data_utworzenia | Data utworzenia sekcji |
data_opublikowania | Data opublikowania sekcji |
kolejnosc | Pole przechowuje numer odpowiedzialny za kolejność wyświetlania wybranej sekcji |
Nazwa pola: | Opis: |
id_kategoria | Klucz główny przydzielony automatycznie |
id_sekcja | Klucz obcy z tabeli „sekcje” |
nazwa_kategorii | Nazwa kategorii |
opis_kategorii | Opis kategorii |
data_utworzenia | Data utworzenia kategorii |
data_opublikowania | Data opublikowania kategorii |
kolejnosc | Pole przechowuje numer odpowiedzialny za kolejność wyświetlania kategorii w wybranej sekcji |
Nazwa pola: | Opis: |
id_artykul | Klucz główny przydzielany automatycznie do artykułu |
id_uzytkownik | Klucz obcy z tabeli „uzytkownicy” |
id_kategoria | Klucz obcy z tabeli „kategorie” |
tytul | Tytuł artykułu |
tekst_artykulu | Zawartość artykułu |
data_utworzenia | Data utworzenia artykułu |
data_opublikowania | Data opublikowania artykułu |
data_modyfikacji | Data ostatniej modyfikacji artykułu |
meta_slowa_kluczowe | Słowa kluczowe znaczniku „meta” w HTML |
meta_opis | Opis znaczniku „meta” w HTML |
meta_autor | Autor artykułu, znacznik „meta” w HTML |
kolejnosc | Pole przechowuje numer odpowiedzialny za kolejność wyświetlania w wybranej kategorii |
przeczytano | Pole zawiera liczbę odpowiedzialną za ilość odwiedzin gościa serwisu w danym artykule |
strona_tytulowa | Pole odpowiedzialne za przechowywanie informacji, czy artykuł ma być wyświetlany na głównej stronie serwisu |
Nazwa pola: | Opis: |
id_pole_menu | Klucz główny przydzielony automatycznie |
id_typ_menu | Klucz obcy z tabeli „typy_menu” |
id_typ_pozycji_menu | Klucz obcy z tabeli „typy_pozycji_menu” |
nazwa | Nazwa przycisku w pozycji menu |
opis | Opis przycisku znacznik „title” |
adres_strony | Adres strony internetowej |
okno | Pole zawiera wartość atrybutu „target” znacznika <a href=””></a> |
data_utworzenia | Data utworzenia przycisku w pozycji menu |
data_opublikowania | Data opublikowania przycisku w pozycji menu |
kolejnosc | Pole przechowuje numer odpowiedzialny za kolejność wyświetlenia przycisku w wybranym menu |
komponent_id | Pole nie jest obowiązkowe i przechowuje numer z klucza głównego komponentu, który jest podpinany pod wybrany przycisk w pozycji menu |
Nazwa pola: | Opis: |
id_typ_menu | Klucz główny przydzielony automatycznie |
typ_menu | Unikatowa nazwa tekstowa pozycji menu np.: mainmenu |
tytul | Nazwa menu |
opis | Opis menu |
Nazwa pola: | Opis: |
id_typ_pozycji_menu | Klucz główny przydzielony automatycznie |
nazwa | Pole tekstowe zawierające nazwę typu pozycji menu np.: Artykuły => Sekcje, Pojedynczy artykuł, Łącze zewnętrzne |
opis | Opis typu pozycji menu |
akcja | Pole, dzięki któremu program rozpoznaje typ pozycji menu wybranego dla konkretnego przycisku. Nazwa pola jest unikatowa oraz typu string. Programiście lepiej jest oprogramowywać dodatkowe funkcje korzystając z pola „akcja” niż za pomocą klucza głównego. Przykładowe nazwy: review_articles, single_article, external_link |
Rysunek 1. prezentuje relację pomiędzy tabelami w bazie danych.
Rys. 1. Relacje przykładowej bazy danych prostego systemu CMS.
Zapraszamy do szczegółowego zapoznania się z tematem projektowania baz danych. W celu poszerzania wiedzy poniżej umieściliśmy listę książek powiązanych z tematem artykułu.
Warto przeczytać również:
Wybrane książki:
- Ryan Stephens, Arie D. Jones, Ron Plew: SQL w 24 godziny. Wydanie VI, Wydawnictwo Helion, 2016.
- Joe Celko: Praktyki mistrza SQL. Programowanie zaawansowane, Wydawnictwo Helion, 2016.
- Bill Karwin: Antywzorce języka SQL. Jak unikać pułapek podczas programowania baz danych, Wydawnictwo Helion, 2012.
- Kae Verens: Projektowanie systemów CMS przy użyciu PHP i jQuery, Wydawnictwo Helion, 2011.
Strony internetowe:
- Baza danych zaprezentowana w artykule pochodzi z projektu zrealizowanego pod marką „Piksel-Net”, więcej na stronie www.piksel-net.pl.