W tym wpisie przyjrzymy się przykładowemu procesowi planowania bazy danych, na przykładzie bazy szkoły. Przejdziemy przez proces planowania i tworzenia tabel w bazie danych i uzupełnimy te tabele przykładowymi danymi. Powstaną tutaj też relacje, klucze główne w tabelach i klucze obce.
Planowanie struktury bazy danych
Nasza baza danych, będzie zawierała takie tabele jak Uczniowie, Nauczyciele, Klasy, Predmioty, Oceny, Obecnosci.
Przejdźmy więc do wstępnego układania poszczególnych tabel
Uczniowie – tabela zawiera podstawowe dane ucznia.
ID_ucznia (klucz główny)
Imie
Nazwisko
Data_urodzenia
Adres
ID_klasy (klucz obcy)
Tabela po zmianie, przyjmie więc strukturę:
Uczniowie:
ID_ucznia (klucz główny)
Imie
Nazwisko
Data_urodzenia
Ulica
Numer_domu
Numer_mieszkania
Kod_pocztowy
Miasto
Kraj
Pesel
ID_klasy (klucz obcy)
Nauczyciele:
ID_nauczyciela (klucz główny)
Imie
Nazwisko
Przedmiot
Klasy:
ID_klasy (klucz główny)
Nazwa_klasy
Rok_rozpoczecia
ID_wychowawcy (klucz obcy)
Przedmioty:
ID_przedmiotu (klucz główny)
Nazwa_przedmiotu
Oceny:
ID_oceny (klucz główny)
Wartosc
Data
ID_ucznia (klucz obcy)
ID_przedmiotu (klucz obcy)
ID_nauczyciela (klucz obcy)
Obecnosci:
ID_obecnosci (klucz główny)
Data
Obecnosc (np. obecny, nieobecny, spóźniony)
ID_ucznia (klucz obcy)
ID_przedmiotu (klucz obcy)
Relacje w tabelach
W powyższym przykładzie zostały już zawarte planowane relacje, jakie wystąpią w tabelach naszej bazy danych szkoły.
Przyjrzyjmy się im bliżej:
- Uczniowie do Klasy poprzez ID_klasy: Każdy uczeń należy do jednej klasy, ale w jednej klasie może być wielu uczniów.
- Klasy do Nauczyciele poprzez ID_wychowawcy: Każda klasa ma jednego wychowawcę, ale jeden nauczyciel może być wychowawcą dla wielu klas.
- Oceny do Uczniowie, Przedmioty, Nauczyciele poprzez odpowiednie klucze obce: Ocena jest przypisana do konkretnego ucznia, nauczyciela (który wystawił ocenę) oraz przedmiotu.
- Obecnosci do Uczniowie i Przedmioty poprzez odpowiednie klucze obce: Informacja o obecności jest przypisana do konkretnego ucznia oraz przedmiotu.
Typy danych nadane do poszczególnych encji
Uczniowie:
ID_ucznia
: INT (klucz główny)Imie
: VARCHAR(50)Nazwisko
: VARCHAR(50)Data_urodzenia
: DATEUlica
: VARCHAR(100)Numer_domu
: VARCHAR(10)Numer_mieszkania
: VARCHAR(10) (może być NULL, jeśli nie dotyczy)Kod_pocztowy
: VARCHAR(10)Miasto
: VARCHAR(50)Kraj
: VARCHAR(50)Pesel
: CHAR(11) (PESEL ma stałą długość 11 znaków)ID_klasy
: INT (klucz obcy)
Nauczyciele:
ID_nauczyciela
: INT (klucz główny)Imie
: VARCHAR(50)Nazwisko
: VARCHAR(50)Przedmiot
: VARCHAR(50)
Klasy:
ID_klasy
: INT (klucz główny)Nazwa_klasy
: VARCHAR(20)Rok_rozpoczecia
: YEARID_wychowawcy
: INT (klucz obcy)
Przedmioty:
ID_przedmiotu
: INT (klucz główny)Nazwa_przedmiotu
: VARCHAR(50)
Oceny:
ID_oceny
: INT (klucz główny)Wartosc
: DECIMAL(3,2) (np. 4.50 dla ocen w skali 1-5 z dwoma miejscami po przecinku)Data
: DATEID_ucznia
: INT (klucz obcy)ID_przedmiotu
: INT (klucz obcy)ID_nauczyciela
: INT (klucz obcy)
Obecnosci:
ID_obecnosci
: INT (klucz główny)Data
: DATEObecnosc
: ENUM(’obecny’, 'nieobecny’, 'spóźniony’)ID_ucznia
: INT (klucz obcy)ID_przedmiotu
: INT (klucz obcy)
Przepisanie struktury bazy danych do postaci kodu MySQL
-- Tabela Uczniowie
CREATE TABLE Uczniowie (
ID_ucznia INT PRIMARY KEY AUTO_INCREMENT,
Imie VARCHAR(50),
Nazwisko VARCHAR(50),
Data_urodzenia DATE,
Ulica VARCHAR(100),
Numer_domu VARCHAR(10),
Numer_mieszkania VARCHAR(10) NULL,
Kod_pocztowy VARCHAR(10),
Miasto VARCHAR(50),
Kraj VARCHAR(50),
Pesel CHAR(11),
ID_klasy INT,
FOREIGN KEY (ID_klasy) REFERENCES Klasy(ID_klasy)
);
-- Tabela Nauczyciele
CREATE TABLE Nauczyciele (
ID_nauczyciela INT PRIMARY KEY AUTO_INCREMENT,
Imie VARCHAR(50),
Nazwisko VARCHAR(50),
Przedmiot VARCHAR(50)
);
-- Tabela Klasy
CREATE TABLE Klasy (
ID_klasy INT PRIMARY KEY AUTO_INCREMENT,
Nazwa_klasy VARCHAR(20),
Rok_rozpoczecia YEAR,
ID_wychowawcy INT,
FOREIGN KEY (ID_wychowawcy) REFERENCES Nauczyciele(ID_nauczyciela)
);
-- Tabela Przedmioty
CREATE TABLE Przedmioty (
ID_przedmiotu INT PRIMARY KEY AUTO_INCREMENT,
Nazwa_przedmiotu VARCHAR(50)
);
-- Tabela Oceny
CREATE TABLE Oceny (
ID_oceny INT PRIMARY KEY AUTO_INCREMENT,
Wartosc DECIMAL(3,2),
Data DATE,
ID_ucznia INT,
ID_przedmiotu INT,
ID_nauczyciela INT,
FOREIGN KEY (ID_ucznia) REFERENCES Uczniowie(ID_ucznia),
FOREIGN KEY (ID_przedmiotu) REFERENCES Przedmioty(ID_przedmiotu),
FOREIGN KEY (ID_nauczyciela) REFERENCES Nauczyciele(ID_nauczyciela)
);
-- Tabela Obecnosci
CREATE TABLE Obecnosci (
ID_obecnosci INT PRIMARY KEY AUTO_INCREMENT,
Data DATE,
Obecnosc ENUM('obecny', 'nieobecny', 'spóźniony'),
ID_ucznia INT,
ID_przedmiotu INT,
FOREIGN KEY (ID_ucznia) REFERENCES Uczniowie(ID_ucznia),
FOREIGN KEY (ID_przedmiotu) REFERENCES Przedmioty(ID_przedmiotu)
);
Dodawanie przykładowych danych do bazy danych
Przykładowe 25 rekordów, jakie dodamy do tabeli Uczniowie:
INSERT INTO Uczniowie (Imie, Nazwisko, Data_urodzenia, Ulica, Numer_domu, Numer_mieszkania, Kod_pocztowy, Miasto, Kraj, Pesel, ID_klasy) VALUES
('Anna', 'Kowalczyk', '2000-04-16', 'Słoneczna', '73', '10', '44-552', 'Poznań', 'Polska', '18244264028', 6),
('Katarzyna', 'Kowalski', '2000-05-21', 'Zielona', '37', '1', '65-274', 'Poznań', 'Polska', '14894248241', 1),
('Jan', 'Lewandowski', '2002-08-31', 'Zielona', '39', '2', '82-530', 'Warszawa', 'Polska', '23133549070', 3),
('Tomasz', 'Wiśniewski', '2005-11-06', 'Polna', '98', '1', '10-244', 'Kraków', 'Polska', '15513518780', 3),
('Piotr', 'Kowalski', '2000-10-26', 'Słoneczna', '54', '6', '38-462', 'Gdańsk', 'Polska', '36713150294', 7),
('Paweł', 'Wójcik', '2007-03-02', 'Kwiatowa', '95', '8', '27-397', 'Wrocław', 'Polska', '75631163522', 2),
('Piotr', 'Nowak', '2008-11-25', 'Kwiatowa', '48', '9', '58-769', 'Warszawa', 'Polska', '34231197757', 8),
('Marcin', 'Szymański', '2005-11-20', 'Zielona', '74', '3', '32-150', 'Wrocław', 'Polska', '60121827121', 10),
('Maria', 'Dąbrowski', '2001-03-02', 'Polna', '35', '10', '27-998', 'Poznań', 'Polska', '25198954282', 7),
('Jan', 'Lewandowski', '2004-04-09', 'Leśna', '77', '4', '76-878', 'Gdańsk', 'Polska', '45577511016', 8),
('Piotr', 'Szymański', '2008-12-19', 'Polna', '83', '4', '73-736', 'Warszawa', 'Polska', '66183232214', 10),
('Marcin', 'Zieliński', '2000-02-02', 'Leśna', '76', '3', '92-114', 'Kraków', 'Polska', '90678359834', 5),
('Anna', 'Nowak', '2001-10-08', 'Kwiatowa', '49', '2', '44-812', 'Wrocław', 'Polska', '87730653285', 9),
('Maria', 'Zieliński', '2000-05-21', 'Zielona', '59', '4', '81-921', 'Gdańsk', 'Polska', '06230404305', 4),
('Piotr', 'Kamiński', '2002-06-24', 'Leśna', '52', '3', '40-270', 'Poznań', 'Polska', '56213235482', 1);
('Jan', 'Nowak', '2008-12-28', 'Słoneczna', '16', '2', '42-417', 'Poznań', 'Polska', '28529141272', 5),
('Agnieszka', 'Szymański', '2004-06-10', 'Zielona', '88', '4', '10-609', 'Kraków', 'Polska', '62979646078', 8),
('Anna', 'Kamiński', '2003-06-23', 'Słoneczna', '92', '4', '13-791', 'Kraków', 'Polska', '85544230188', 5),
('Katarzyna', 'Dąbrowski', '2007-09-18', 'Kwiatowa', '53', '6', '39-175', 'Poznań', 'Polska', '40274951949', 8),
('Barbara', 'Kowalski', '2000-07-14', 'Kwiatowa', '39', '10', '97-766', 'Poznań', 'Polska', '32126649525', 2),
('Tomasz', 'Kowalczyk', '2001-12-26', 'Polna', '9', '2', '48-774', 'Gdańsk', 'Polska', '47344443410', 4),
('Paweł', 'Wójcik', '2007-07-29', 'Kwiatowa', '22', '6', '82-670', 'Gdańsk', 'Polska', '19135636356', 10),
('Katarzyna', 'Szymański', '2004-12-06', 'Kwiatowa', '87', '1', '83-947', 'Kraków', 'Polska', '74671969054', 2),
('Katarzyna', 'Zieliński', '2001-03-19', 'Zielona', '56', '5', '78-294', 'Poznań', 'Polska', '34732275331', 6),
('Barbara', 'Zieliński', '2002-05-12', 'Słoneczna', '60', '7', '65-146', 'Warszawa', 'Polska', '26287066810', 3);
Przykładowe rekordy, w tabeli Nauczyciele:
INSERT INTO Nauczyciele (Imie, Nazwisko, Przedmiot) VALUES
('Robert', 'Szczepańska', 'Matematyka'),
('Krzysztof', 'Skowron', 'Chemia'),
('Marta', 'Mazurek', 'Biologia'),
('Monika', 'Jaworski', 'W-F'),
('Jacek', 'Borowski', 'Historia'),
('Magdalena', 'Zatorski', 'Chemia'),
('Krzysztof', 'Borowski', 'Historia'),
('Marta', 'Skowron', 'Polski'),
('Monika', 'Skowron', 'Muzyka'),
('Michał', 'Małek', 'Biologia'),
('Krzysztof', 'Ostrowska', 'Polski'),
('Michał', 'Piechota', 'Polski'),
('Marta', 'Mazurek', 'Historia'),
('Robert', 'Ostrowska', 'Biologia'),
('Marta', 'Szczepańska', 'Historia');
Przykładowe dane w tabeli Klasy:
INSERT INTO Klasy (Nazwa_klasy, Rok_rozpoczecia, ID_wychowawcy) VALUES
('IIIc', 2019, 14),
('VIe', 2019, 4),
('IVd', 2020, 7),
('VIb', 2021, 2),
('Id', 2021, 11);
Zmiany w tabelach naszej bazy danych
W trakcie tworzenia przykładowych rekordów, zauważamy, że przydała by się zmiana. Otóż w tabeli przewidzieliśmy na wstępie ID_wychowawcy. Warto przemyśleć zmianę, polegającą na wprowadzeniu oddzielnie tabeli Wychowawcy.
Aktualny kod:
CREATE TABLE Klasy (
ID_klasy INT PRIMARY KEY AUTO_INCREMENT,
Nazwa_klasy VARCHAR(20),
Rok_rozpoczecia YEAR,
ID_wychowawcy INT,
FOREIGN KEY (ID_wychowawcy) REFERENCES Nauczyciele(ID_nauczyciela)
);
Kod wprowadzający zmiany do naszej bazy danych:
Tworzymy nową tabelę Wychowawcy
— Tabela Wychowawcy
CREATE TABLE Wychowawcy (
ID_wychowawcy INT PRIMARY KEY AUTO_INCREMENT,
ID_nauczyciela INT,
-- Możesz dodać dodatkowe pola specyficzne dla wychowawców
FOREIGN KEY (ID_nauczyciela) REFERENCES Nauczyciele(ID_nauczyciela)
);
Korzystamy tutaj z kwerendy Alter Table, dla tabeli klasy, gdzie usuwamy klucz obcy
— Aktualizacja tabeli Klasy
ALTER TABLE Klasy
DROP FOREIGN KEY ID_wychowawcy; -- Wymaga podania nazwy klucza obcego do usunięcia
ALTER TABLE Klasy
ADD FOREIGN KEY (ID_wychowawcy) REFERENCES Wychowawcy(ID_wychowawcy);