Schemat biblioteki jest przedstawiony w formie graficznej utworzonej w programie MySQL Workbench. Projekt wykorzystuje silnik bazy danych InnoDB. Zachęcam do zainstalowania wspomnianego programu i przepisania schematu bazy danych (rys. 1.). Artykuł zawiera wszystkie informacje potrzebne do prawidłowego uruchomienia przykładu. Materiały do artykułu można znaleźć w pliku mysql-biblioteka.zip.
1. Schemat bazy danych
Rysunek 1. prezentuje relację pomiędzy tabelami w bazie danych.
W bazie danych znajduje się sześć tabel:
- czytelnik - posiada informacje o czytelnikach zarejestrowanych w programie (Tabela 1.);
- zamowienie - posiada informacje o zamówionych, wypożyczonych czy oddanych książkach w bibliotece (Tabela 2.);
- kategoria - tabela zawierająca wszystkie kategorie książek w systemie (Tabela 3.);
- ksiazka - wszystkie książki dodane do bazy danych (Tabela 4.);
- bibliotekarz - posiada informacje o bibliotekarzach zarejestrowanych w programie (Tabela 5.);
- admin - posiada informacje o administratorach zarejestrowanych w programie (Tabela 6.).
Tabele 1 - 6 prezentują strukturę tabel.
Nazwa pola: | Opis: |
id_czytelnik | Klucz główny przydzielony automatycznie |
login | Nazwa czytelnika potrzeba przy logowaniu |
haslo | Hasło niezaszyfrowane |
imie | Imię |
nazwisko | Nazwisko |
adres | Adres zamieszkania np.: ul. Przykład 3/12 |
miasto | Miasto |
wojewodztwo | Nazwa województwa |
telefon | Telefony |
kod_pocztowy | Kod pocztowy |
Adres e-mail |
Nazwa pola: | Opis: |
id_zamowienie | Klucz główny przydzielony automatycznie |
id_czytelnik | Klucz obcy z tabeli "czytelnik" |
id_ksiazka | Klucz obcy z tabeli "ksiazka" |
data_zamowienia | Data złożenia zamówienia w bibliotece |
data_odbioru | Data odbioru książki z biblioteki |
data_zwrotu | Data zwrotu książki do biblioteki |
Nazwa pola: | Opis: |
id_kategoria | Klucz główny przydzielony automatycznie |
nazwa | Nazwa kategorii |
Nazwa pola: | Opis: |
id_ksiazka | Klucz główny przydzielony automatycznie |
id_kategoria | Klucz obcy z tabeli "kategoria" |
isbn | Niepowtarzalny 13-cyfrowy identyfikator książki |
tytul | Tytuł książki |
autor | Imię i Nazwisko autora książki |
stron | Liczba stron książki |
wydawnictwo | Nazwa wydawnictwa, w którym wydano książkę |
rok_wydania | Rok wydania książki |
opis | Opis książki |
Nazwa pola: | Opis: |
id_bibliotekarz | Klucz główny przydzielony automatycznie |
login | Nazwa bibliotekarza potrzebna przy logowaniu |
haslo | Hasło niezaszyfrowane |
Nazwa pola: | Opis: |
id_admin | Klucz główny przydzielony automatycznie |
login | Nazwa administratora potrzebna przy logowaniu |
haslo | Hasło niezaszyfrowane |
2. Tworzenie bazy danych
Po uruchomieniu MySQL należy utworzyć bazę danych odpowiedzialną za zarządzanie projektem biblioteki (Listing 1.).
Listing 1. Polecenie tworzące bazę danych
CREATE DATABASE biblioteka;
3. Rejestrowanie użytkownika
Do pracy z bazą danych MySQL potrzebny jest użytkownik. Domyślnym użytkownikiem jest root - jeśli pracujemy na localhost. Możemy również utworzyć nowego użytkownika dla konkretnej bazy danych - polecenie GRANT (Listing 2.).
Listing 2. Składnia polecenia GRANT
GRANT przywileje[kolumny]
ON obiekt
TO identyfikator_użytkownika [IDENTIFIED BY 'hasło']
[WITH GRANT OPTION]
Polecenie GRANT przedstawione na listingu 3 odpowiada za utworzenie użytkownika biblioteka z uprawnieniami SELECT, INSERT, DELETE, UPDATE z hasłem biblioteka. Konto biblioteka posiada dostęp do wszystkich tabel w bazie danych "biblioteka".
Listing 3. Polecenie odpowiedzialne za utworzenie konta użytkownika
GRANT SELECT, INSERT, DELETE, UPDATE
ON biblioteka.*
TO biblioteka@localhost IDENTIFIED BY 'biblioteka';
4. Przejście do odpowiedniej bazy danych
Po zalogowaniu się do bazy danych będziemy zmuszeni przejść do interesującej nas bazy danych "biblioteka" za pomocą polecenia USE (Listing 4.).
Listing 4. Przejście do bazy danych biblioteka
USE biblioteka;
5. Polecenie CREATE
Po utworzeniu bazy danych należy utworzyć tabele za pomocą polecenia CREATE (listing 5.). Wymagany kod do utworzenia tabel został przedstawiony na listingu 6.
Listing 5. Składnia polecenia CREATE
CREATE TABLE nazwa_tabeli (kolumny)
Listing 6. Polecenia odpowiedzialne za dodanie wszystkich tabel do bazy danych
-- -----------------------------------------------------
-- Table `biblioteka`.`czytelnik`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteka`.`czytelnik` (
`id_czytelnik` INT NOT NULL AUTO_INCREMENT COMMENT 'Klucz główny przydzielony automatycznie',
`login` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Nazwa czytelnika potrzeba przy logowaniu.',
`haslo` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Hasło niezaszyfrowane',
`imie` VARCHAR(100) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Imię ',
`nazwisko` VARCHAR(100) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Nazwisko',
`adres` VARCHAR(200) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Adres zamieszkania np.: ul. Przykład 3/12',
`miasto` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Miasto',
`wojewodztwo` VARCHAR(100) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Nazwa województwa',
`telefon` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NULL COMMENT 'Telefony',
`kod_pocztowy` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Kod pocztowy',
`email` VARCHAR(100) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Adres e-mail',
PRIMARY KEY (`id_czytelnik`))
ENGINE = InnoDB
COMMENT = 'Posiada informacje o czytelnikach zarejestrowanych w programie.';
-- -----------------------------------------------------
-- Table `biblioteka`.`kategoria`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteka`.`kategoria` (
`id_kategoria` INT NOT NULL AUTO_INCREMENT COMMENT 'Klucz główny przydzielony automatycznie',
`nazwa` VARCHAR(200) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Nazwa kategorii',
PRIMARY KEY (`id_kategoria`))
ENGINE = InnoDB
COMMENT = 'Tabela zawierająca wszystkie kategorie książek w systemie.';
-- -----------------------------------------------------
-- Table `biblioteka`.`ksiazka`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteka`.`ksiazka` (
`id_ksiazka` INT NOT NULL AUTO_INCREMENT COMMENT 'Klucz główny przydzielony automatycznie',
`id_kategoria` INT NOT NULL COMMENT 'Klucz obcy z tabeli kategoria',
`isbn` VARCHAR(13) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Niepowtarzalny 13-cyfrowy identyfikator książki',
`tytul` VARCHAR(200) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Tytuł książki',
`autor` VARCHAR(70) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Imię i Nazwisko autora książki',
`stron` INT(4) NOT NULL COMMENT 'Liczba stron książki',
`wydawnictwo` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Nazwa wydawnictwa, w którym wydano książkę',
`rok_wydania` INT(4) NOT NULL COMMENT 'Rok wydania książki',
`opis` TEXT CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NULL COMMENT 'Opis książki',
PRIMARY KEY (`id_ksiazka`),
INDEX `fk_ksiazka_kategoria1_idx` (`id_kategoria` ASC),
CONSTRAINT `fk_ksiazka_kategoria1`
FOREIGN KEY (`id_kategoria`)
REFERENCES `biblioteka`.`kategoria` (`id_kategoria`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
COMMENT = 'Wszystkie książki dodane do bazy danych.';
-- -----------------------------------------------------
-- Table `biblioteka`.`zamowienie`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteka`.`zamowienie` (
`id_zamowienie` INT NOT NULL AUTO_INCREMENT COMMENT 'Klucz główny przydzielony automatycznie',
`id_czytelnik` INT NOT NULL COMMENT 'Klucz obcy z tabeli czytelnik',
`id_ksiazka` INT NOT NULL COMMENT 'Klucz obcy z tabeli ksiazka',
`data_zamowienia` DATETIME NOT NULL COMMENT 'Data złożenia zamówienia w bibliotece',
`data_odbioru` DATETIME NULL COMMENT 'Data odbioru książki z biblioteki ',
`data_zwrotu` DATETIME NULL COMMENT 'Data zwrotu książki do biblioteki',
PRIMARY KEY (`id_zamowienie`),
INDEX `fk_zamowienie_czytelnik1_idx` (`id_czytelnik` ASC),
INDEX `fk_zamowienie_ksiazka1_idx` (`id_ksiazka` ASC),
CONSTRAINT `fk_zamowienie_czytelnik1`
FOREIGN KEY (`id_czytelnik`)
REFERENCES `biblioteka`.`czytelnik` (`id_czytelnik`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_zamowienie_ksiazka1`
FOREIGN KEY (`id_ksiazka`)
REFERENCES `biblioteka`.`ksiazka` (`id_ksiazka`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
COMMENT = 'Posiada informacje o zamówionych, wypożyczonych czy oddanych książkach w bibliotece.';
-- -----------------------------------------------------
-- Table `biblioteka`.`admin`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteka`.`admin` (
`id_admin` INT NOT NULL AUTO_INCREMENT COMMENT 'Klucz główny przydzielony automatycznie',
`login` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Nazwa administratora potrzebna przy logowaniu',
`haslo` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Hasło niezaszyfrowane',
PRIMARY KEY (`id_admin`))
ENGINE = InnoDB
COMMENT = 'Posiada informacje o administratorach zarejestrowanych w programie.';
-- -----------------------------------------------------
-- Table `biblioteka`.`bibliotekarz`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `biblioteka`.`bibliotekarz` (
`id_bibliotekarz` INT NOT NULL AUTO_INCREMENT COMMENT 'Klucz główny przydzielony automatycznie',
`login` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Nazwa bibliotekarza potrzebna przy logowaniu',
`haslo` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL COMMENT 'Hasło niezaszyfrowane',
PRIMARY KEY (`id_bibliotekarz`))
ENGINE = InnoDB
COMMENT = 'Posiada informacje o bibliotekarzach zarejestrowanych w programie.';
6. Polecenie INSERT
Polecenie INSERT służy do zapisywania nowych danych w tabelach (Listing 7). Dodanie nowej książki przedstawiono na listingu 8.
Listing 7. Składnia polecenia INSERT
INSERT [INTO] nazwa_tabeli (kolumna_1, kolumna_2, kolumna_3, ...)
VALUE (wartość_1, wartość_2, wartość_3, ...);
Listing 8. Dodawanie nowego rekordu do tabeli ksiazka
INSERT INTO biblioteka.ksiazka VALUE(20, 3, 8373614117, 'Java. Tworzenie gier', 'David Brackeen, Bret Barker, Laurence Vanhelsuwe', 784, 'Helion', 2004, 'Napisz wspaniałą grę w Javie. W tej książce znajdziesz wszystkie wiadomości, które są do tego niezbędne.');
MySQL wymaga aby łańcuchy znaków były podawane w cudzysłowach albo apostrofach i oddzielone przecinkami. Zaś liczby i daty nie wymagają cudzysłowów ani apostrofów.
Listing 9. Dodawanie nowego rekordu do tabeli ksiazka z pominięciem pól opcjonalnych.
INSERT INTO ksiazka SET id_ksiazka=21, id_kategoria=3, isbn='9788324685004', tytul='TDD. Sztuka tworzenia dobrego kodu', autor='Kent Beck', stron='232', wydawnictwo='Helion', rok_wydania='2014';
Kod listingu 9 zadziała w ten sam sposób jak kod listingu 8. Wystarczy porównać posiadane informacje z nazwami kolumn, nie są wymagane wszystkie dane można pominąć pola opcjonalne.
Przykładowe dane dla biblioteki zostały przedstawione na listingu 10.
Listing 10. Przykładowe dane, polecenia INSERT - baza danych biblioteka
USE biblioteka;
-- -----------------------------------------------------
-- Skrypt odpowiedzialny za dodanie kategorii do systemu
-- -----------------------------------------------------
INSERT INTO biblioteka.kategoria VALUES(1, 'Biznes');
INSERT INTO biblioteka.kategoria VALUES(2, 'Poradniki');
INSERT INTO biblioteka.kategoria VALUES(3, 'Programowanie');
INSERT INTO biblioteka.kategoria VALUES(4, 'Programowanie mobilne');
INSERT INTO biblioteka.kategoria VALUES(5, 'Webmasterstwo');
INSERT INTO biblioteka.kategoria VALUES(6, 'Systemy operacyjne');
-- -----------------------------------------------------
-- Skrypt odpowiedzialny za dodanie bibliotekarza do systemu
-- -----------------------------------------------------
INSERT INTO biblioteka.bibliotekarz VALUES(null, 'bibliotekarz', 'bibliotekarz');
-- -----------------------------------------------------
-- Skrypt odpowiedzialny za dodanie administratora do systemu
-- -----------------------------------------------------
INSERT INTO biblioteka.admin VALUES(null, 'admin', 'admin');
-- -----------------------------------------------------
-- Skrypt odpowiedzialny za dodanie czytelników do systemu
-- -----------------------------------------------------
INSERT INTO biblioteka.czytelnik VALUES(1, 'czytelnik_1', 'hasło_czytelnika', 'Piotr', 'Klimek', 'ul. Przykład 4/ 12', 'Lublin', 'Lubelskie', null, '20-998', Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.');
INSERT INTO biblioteka.czytelnik VALUES(2, 'czytelnik_2', 'hasło_czytelnika', 'Patryk', 'Klimek', 'ul. Przykład 10/300', 'Lublin', 'Lubelskie', null, '20-999', Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.');
-- -----------------------------------------------------
-- Skrypt odpowiedzialny za dodanie książek do systemu
-- -----------------------------------------------------
INSERT INTO biblioteka.ksiazka VALUE(1, 3, 9788324631773, 'PHP i MySQL. Tworzenie stron WWW. Vademecum profesjonalisty. Wydanie czwarte', 'Luke Welling, Laura Thomson', 856, 'Helion', 2009, 'Czwarte wydanie bestsellerowego podręcznika dla webmasterów wykorzystujących w swojej pracy funkcjonalność języka PHP i bazy danych MySQL.');
INSERT INTO biblioteka.ksiazka VALUE(2, 3, 9788324685301, 'Język C++. Kompendium wiedzy', 'Bjarne Stroustrup', 1296, 'Helion', 2014, null);
INSERT INTO biblioteka.ksiazka VALUE(3, 3, 9788324675340, 'Mistrz czystego kodu. Kodeks postępowania profesjonalnych programistów', 'Robert C. Martin', 216, 'Helion', 2013, null);
INSERT INTO biblioteka.ksiazka VALUE('4', '6', '9788324690138', 'Kali Linux. Testy penetracyjne', 'Joseph Muniz, Aamir Lakhani', '336', 'Helion', '2014', null);
INSERT INTO biblioteka.ksiazka VALUE(5, 3, 9788324621880, 'Czysty kod. Podręcznik dobrego programisty', 'Robert C. Martin', 424, 'Helion', 2010, null);
INSERT INTO biblioteka.ksiazka VALUE(6, 3, 9788324632374, 'Pragmatyczny programista. Od czeladnika do mistrza', 'Andrew Hunt, David Thomas', 332, 'Helion', 2011, null);
INSERT INTO biblioteka.ksiazka VALUE(7, 3, 9788324683178, 'Praca z zastanym kodem. Najlepsze techniki', 'Michael Feathers', 440, 'Helion', 2014, null);
INSERT INTO biblioteka.ksiazka VALUE(8, 5, 9788324685042, 'Tajemnice JavaScriptu. Podręcznik ninja', 'John Resig, Bear Bibeault', 432, 'Helion', 2014, null);
INSERT INTO biblioteka.ksiazka VALUE(9, 3, 9788324689361, 'Java EE 6. Tworzenie aplikacji w NetBeans 7', 'David R. Heffelfinger', 352, 'Helion', 2014, null);
INSERT INTO biblioteka.ksiazka VALUE(10, 5, 9788324666676, 'Projektowanie stron internetowych. Przewodnik dla początkujących webmasterów po HTML5, CSS3 i grafice. Wydanie IV', 'Jennifer Niederst Robbins', 600, 'Helion', 2014, null);
-- -----------------------------------------------------
-- Skrypt odpowiedzialny za dodanie zamówień dla czytelnik_1
-- -----------------------------------------------------
INSERT INTO biblioteka.zamowienie SET id_czytelnik=1, id_ksiazka=1, data_zamowienia='2014-08-01 10:12:02';
INSERT INTO biblioteka.zamowienie SET id_czytelnik=1, id_ksiazka=2, data_zamowienia='2014-08-01 10:12:02', data_odbioru='2014-08-03 12:10:10';
INSERT INTO biblioteka.zamowienie SET id_czytelnik=1, id_ksiazka=5, data_zamowienia='2014-08-01 10:13:02', data_odbioru='2014-08-03 12:11:10', data_zwrotu='2014-08-15 12:00:00';
-- -----------------------------------------------------
-- Skrypt odpowiedzialny za dodanie dwóch zamówień dla czytelnik_2
-- -----------------------------------------------------
INSERT INTO biblioteka.zamowienie SET id_czytelnik=2, id_ksiazka=3, data_zamowienia='2014-08-02 12:00:02';
INSERT INTO biblioteka.zamowienie SET id_czytelnik=2, id_ksiazka=4, data_zamowienia='2014-08-03 09:12:02', data_odbioru='2014-08-05 15:20:00';
7. Polecenie SELECT
Polecenie SELECT jest jednym z najczęściej wykonywanych poleceń w języku SQL (Listing 10.).
Listing 10. Składnia polecenia SELECT
SELECT pozycje
FROM nazwy_tabel
[WHERE warunek]
[GROUP BY rodzaj_grupowania]
[HAVING wartość_funkcji]
[ORDER BY porządek_sortowania]
[LIMIT ilość];
Na listingu 11 przedstawiono zapytanie SELECT wyszukujące wszystkich czytelników (rys. 2.).
Listing 11. Proste zapytanie SELECT dotyczące czytelników
SELECT id_czytelnik, imie, nazwisko, miasto, telefon FROM biblioteka.czytelnik;
Rys. 2. Lista czytelników w bibliotece
Na listingu 12 przedstawiono zapytanie SELECT wyświetlające wszystkie kategorie (rys. 3.).
Listing 12. Polecenie SELECT wyświetla wszystkie kolumny tabeli kategoria
SELECT * FROM kategoria;
Rys. 3. Lista wszystkich kategorii
Na listingu 13 przedstawiono zapytanie SELECT wyświetlające wszystkie zamówione książki dla wybranego czytelnika, id_czytelnik=1 (rys. 4.).
Listing 13. Polecenie SELECT wyświetla informacje o wybranym czytelniku
SELECT * FROM biblioteka.zamowienie WHERE id_czytelnik = 1;
Rys. 4. Lista wszystkich zamówień wybranego czytelnika biblioteki
Na listingu 14 przedstawiono zapytanie SELECT wyszukujące zamówienia, które zawierają szukany ISBN książki (rys. 5.).
Listing 14. Polecenie SELECT sprawdza dane z kilku tabel jednocześnie
SELECT z.id_zamowienie, k.isbn, z.id_czytelnik, z.data_zamowienia, z.data_odbioru
FROM zamowienie z, ksiazka k
WHERE k.isbn = '9788324685301'
AND z.id_ksiazka = k.id_ksiazka
ORDER BY z.data_zamowienia DESC
LIMIT 1;
Rys. 5. Wynik zapytania z dwóch tabel
8. Polecenie UPDATE
Polecenie UPDATE stosujemy do uaktualniania danych w tabelach (Listing 15).
Listing 15. Składnia polecenia UPDATE
UPDATE nazwa_tabeli
SET kolumna_1 = wyrażenie_1, kolumna_2 = wyrażenie_2, …
[WHERE warunek]
[LIMIT ilość]
W celu uaktualnieniu danych w wybranym zamówieniu należy skorzystać z zapytania przedstawionego na listingu 16 (rys. 6., rys. 7.).
Listing 16. Zapytanie dodaje datę odbioru książki przez czytelnika z aktualnym czasem.
UPDATE zamowienie SET data_odbioru = CURRENT_TIMESTAMP WHERE id_zamowienie = '4';
Rys. 6. Lista zamówień przed aktualizacją
Rys. 7. Lista zamówień po aktualizacji
9. Zakończenie
Projekt został zrealizowany na zakończenie studium informatycznego w 2005 roku. Baza danych była tylko częścią aplikacji obsługiwanej przez przeglądarkę internetową.
Materiały do artykułu można znaleźć w pliku mysql-biblioteka.zip.
Dodatkowe zadania:
- Połączyć tabele bibliotekarz i admin, stworzyć dodatkowe pole odpowiedzialne za rozróżnienie wybranego konta, czy jest administratorem czy bibliotekarzem. Nowa nazwa tabeli user. Podpowiedzi należy szukać w artykule "Przykładowa baza danych prostego systemu CMS".
- Połączyć nową tabele user z tabelą czytelnik w celu przechowania informacji, który z administratorów czy bibliotekarzy utworzył konto wybranego czytelnika. Podpowiedzi należy szukać w artykule "Przykładowa baza danych prostego systemu CMS".
- Utworzyć tabele adres i kontakt przechowujące informacje dla czytelnika, bibliotekarza i administratora. Jak utworzyć tabele można zrozumieć przeglądając artykuł "Przykładowa baza danych sklepu internetowego, diagram związków encji".
- Po zapoznaniu się z przykładową bazą danych, każdy z czytelników znajdzie kilka fragmentów, które z chęcią by poprawił. Ostatnim zadaniem jest stworzenie własnej bazy danych od podstaw, która będzie posiadała poprawki czytelnika. Zapraszam do eksperymentowania.
Warto przeczytać również:
- Przykładowy projekt bazy danych strony internetowej
- Projekt bazy danych - Baza serwisowa sprzętu RTV
- Przykładowa baza danych sklepu internetowego, diagram związków encji
- Przykładowa baza danych prostego systemu CMS
- MySQL Workbench
- Nathan Marz, James Warren: Big Data. Najlepsze praktyki budowy skalowalnych systemów obsługi danych w czasie rzeczywistym, Wydawnictwo Helion, 2016.
- Joe Celko: Praktyki mistrza SQL. Programowanie zaawansowane, Wydawnictwo Helion, 2016.
- Ryan Stephens, Arie D. Jones, Ron Plew: SQL w 24 godziny. Wydanie VI, Wydawnictwo Helion, 2016.
- John Viescas, Michael J. Hernandez: Zapytania w SQL. Przyjazny przewodnik, Wydawnictwo Helion, 2015.
- Bill Karwin: Antywzorce języka SQL. Jak unikać pułapek podczas programowania baz danych, Wydawnictwo Helion, 2015.
- Paul DuBois: MySQL. Vademecum profesjonalisty. Wydanie V, Wydawnictwo Helion, 2014.
Strony internetowe: