NA POCZĄTEK ZROZUMIEĆ BAZĘ DANYCH
NA POCZĄTEK ZROZUMIEĆ BAZĘ DANYCH
Zrozumienie podstaw
Zanim przejdziemy do konkretnych przykładów, warto przypomnieć sobie podstawowe pojęcia:
Baza danych: Zbiór zorganizowanych danych, przechowywanych w sposób umożliwiający szybki dostęp, modyfikację i zarządzanie.
Tabela: Jednostka organizacyjna w bazie danych, składająca się z wierszy (rekordów) i kolumn (pól).
Rekord: Pojedynczy wiersz w tabeli, reprezentujący jedną instancję danych.
Pole: Pojedyncza kolumna w tabeli, określająca typ danych przechowywanych w danym rekordzie.
SQL (Structured Query Language): Język służący do komunikacji z bazami danych, umożliwiający tworzenie, modyfikowanie i zarządzanie danymi.
Przykład: Baza danych dla biblioteki
Załóżmy, że chcemy stworzyć bazę danych dla biblioteki. Będziemy przechowywać informacje o książkach, autorach i czytelnikach.
1. Tworzenie bazy danych
Najpierw musimy wybrać system zarządzania bazą danych (np. MySQL, PostgreSQL, SQL Server). Następnie, za pomocą odpowiedniego narzędzia (np. phpMyAdmin, pgAdmin) lub linii komend, tworzymy nową bazę danych.
2. Tworzenie tabel
CREATE TABLE ksiazki (
id INT PRIMARY KEY AUTO_INCREMENT,
tytul VARCHAR(100),
rok_wydania INT );
CREATE TABLE autorzy (
id INT PRIMARY KEY AUTO_INCREMENT,
imie VARCHAR(50),
nazwisko VARCHAR(50) );
CREATE TABLE czytelnicy (
id INT PRIMARY KEY AUTO_INCREMENT,
imie VARCHAR(50),
nazwisko VARCHAR(50),
numer_telefonu VARCHAR(20) );
id: Unikalny identyfikator każdego rekordu (klucz główny).
VARCHAR: Typ danych dla tekstów o zmiennej długości.
INT: Typ danych dla liczb całkowitych.
3. Łączenie tabel (relacje)
W większości baz danych, stosuje się klucze obce, aby łączyć ze sobą tabele. Na przykład, możemy dodać kolumnę autor_id do tabeli ksiazki, aby wskazać, który autor napisał daną książkę.
ALTER TABLE ksiazki ADD COLUMN autor_id INT;
ALTER TABLE ksiazki ADD FOREIGN KEY (autor_id) REFERENCES autorzy(id);
4. Wstawianie rekordów
INSERT INTO autorzy (imie, nazwisko)
VALUES ('Jan', 'Kowalski'),
('Anna', 'Nowak');
INSERT INTO ksiazki (tytul, autor_id, rok_wydania)
VALUES ('Pan Tadeusz', 1, 2000),
('Lalka', 2, 1995);
5. Wybieranie danych
Aby wyświetlić dane z bazy danych, używamy instrukcji SELECT:
SELECT * FROM ksiazki;
Ważne uwagi:
Typy danych: Wybieraj odpowiednie typy danych dla przechowywanych informacji (np. DATE dla dat, DECIMAL dla liczb dziesiętnych).
Ograniczenia: Stosuj ograniczenia (np. UNIQUE, NOT NULL) aby zapewnić spójność danych.
Indeksy: Twórz indeksy na często wyszukiwanych kolumnach, aby przyspieszyć zapytania.
Normalizacja: Projektuj bazę danych zgodnie z zasadami normalizacji, aby uniknąć redundancji danych.
Analiza wypożyczeń:
Która książka została wypożyczona najczęściej?
Jaka była średnia liczba wypożyczeń miesięcznie w 2023 roku?
Którzy autorzy mają średnio najwięcej wypożyczanych książek?
Analiza czytelników:
Którzy czytelnicy wypożyczyli najwięcej książek w ciągu ostatniego roku?
Jaka jest średnia liczba wypożyczeń na jednego czytelnika premium w miesiącu?
Który gatunek książek jest najczęściej wypożyczany przez czytelników standardowych? (Zakładając, że istnieje tabela gatunki z kolumnami id i nazwa, a tabela ksiazki ma dodatkową kolumnę gatunek_id - jeśli nie zmodyfikuj odpowiednio tabelę)
Biorąc pod uwagę stworzoną przez nas bazę danych biblioteki, możemy zadać następujące pytania i odpowiednio sformułować zapytania SQL:
SELECT autorzy.imie, autorzy.nazwisko, COUNT(*) AS liczba_książek
FROM autorzy
INNER JOIN ksiazki ON autorzy.id = ksiazki.autor_id
GROUP BY autorzy.id;
Wyjaśnienie: Zapytanie łączy tabele autorzy i ksiazki na podstawie autor_id. Następnie grupuje wyniki według identyfikatora autora i liczy liczbę książek dla każdego autora.
SELECT rok_wydania, COUNT(*) AS liczba_książek
FROM ksiazki
GROUP BY rok_wydania
ORDER BY liczba_książek DESC
LIMIT 1;
Wyjaśnienie: Zapytanie grupuje książki według roku wydania, liczy liczbę książek dla każdego roku i sortuje wyniki malejąco po liczbie książek. Następnie wybiera tylko pierwszy wiersz, czyli rok z największą liczbą wydanych książek.
SELECT tytul
FROM ksiazki
INNER JOIN autorzy ON ksiazki.autor_id = autorzy.id
WHERE autorzy.imie = 'Jan' AND autorzy.nazwisko = 'Kowalski';
Wyjaśnienie: Zapytanie łączy tabele ksiazki i autorzy i wybiera tytuły książek, gdzie autor ma imię "Jan" i nazwisko "Kowalski".
Uwaga: Aby odpowiedzieć na to pytanie, musielibyśmy dodać do naszej bazy danych tabelę wypozyczenia, która łączyłaby czytelników z książkami. Załóżmy, że tabela wypozyczenia ma kolumny: id, czytelnik_id, ksiazka_id, data_wypozyczenia.
SELECT czytelnicy.imie, czytelnicy.nazwisko
FROM czytelnicy
INNER JOIN wypozyczenia ON czytelnicy.id = wypozyczenia.czytelnik_id
INNER JOIN ksiazki ON wypozyczenia.ksiazka_id = ksiazki.id
INNER JOIN autorzy ON ksiazki.autor_id = autorzy.id
WHERE autorzy.imie = 'Anna' AND autorzy.nazwisko = 'Nowak';
Wyjaśnienie: To bardziej złożone zapytanie łączy wszystkie cztery tabele: czytelnicy, wypozyczenia, ksiazki i autorzy. Wybiera imiona i nazwiska czytelników, którzy wypożyczyli książki napisane przez Annę Nowak.
SELECT ksiazki.tytul, COUNT(*) AS liczba_wypozyczen
FROM ksiazki
INNER JOIN wypozyczenia ON ksiazki.id = wypozyczenia.ksiazka_id
GROUP BY ksiazki.id
ORDER BY liczba_wypozyczen DESC
LIMIT 1;
Co to są uprawnienia w bazie danych?
Uprawnienia w bazie danych określają, jakie działania może wykonywać dany użytkownik lub grupa użytkowników na obiektach w bazie (tabelach, widokach, procedurach itp.). Mogą to być uprawnienia do:
Odczytu: przeglądania danych
Modyfikacji: aktualizowania, usuwania danych
Tworzenia: tworzenia nowych obiektów
Wykonywania: uruchamiania procedur, funkcji
Jak nadać uprawnienia?
Sposób nadawania uprawnień zależy od systemu zarządzania bazą danych (RDBMS), którego używasz. Najczęściej używanym językiem do zarządzania uprawnieniami jest SQL.
Przykład dla MySQL:
GRANT SELECT, INSERT, UPDATE ON baza_danych.tabela TO 'uzytkownik'@'host';
GRANT: Słowo kluczowe inicjujące polecenie nadania uprawnień.
SELECT, INSERT, UPDATE: Określa jakie uprawnienia nadajemy (odczyt, wstawianie, aktualizacja). Możesz dodać więcej uprawnień, np. DELETE (usuwanie).
ON baza_danych.tabela: Określa na jakim obiekcie nadajemy uprawnienia (baza danych, tabela).
TO 'uzytkownik'@'host';: Określa dla kogo nadajemy uprawnienia (użytkownik o podanej nazwie, łączący się z określonego hosta).
Inne przykłady:
Nadanie pełnych uprawnień:
GRANT ALL PRIVILEGES ON baza_danych.* TO 'uzytkownik'@'host';
Nadanie uprawnień do tworzenia tabel:
GRANT CREATE TABLE ON baza_danych TO 'uzytkownik'@'host';
Nadanie uprawnień do wykonywania procedury:
GRANT EXECUTE ON PROCEDURE baza_danych.procedura TO 'uzytkownik'@'host';
Odwołanie uprawnień:
REVOKE SELECT, INSERT ON baza_danych.tabela FROM 'uzytkownik'@'host';
Ważne uwagi:
Hierarchia uprawnień: W wielu systemach istnieje hierarchia uprawnień, np. użytkownik z uprawnieniami do modyfikacji ma również uprawnienia do odczytu.
Role: Wiele systemów pozwala na tworzenie ról, które grupują uprawnienia. Możesz następnie przypisywać role do użytkowników.
Bezpieczeństwo: Nadawaj uprawnienia z rozwagą. Zbyt szerokie uprawnienia mogą stanowić zagrożenie dla bezpieczeństwa danych.
Specyfika systemów: Każdy system RDBMS ma swoje własne dialekty SQL i dodatkowe funkcje związane z zarządzaniem uprawnieniami.
Dlaczego zarządzanie uprawnieniami jest ważne?
Bezpieczeństwo: Chroni dane przed nieautoryzowanym dostępem.
Kontrola: Pozwala na precyzyjne określenie, kto może co robić w bazie danych.
Zgodność: Pomaga spełnić wymagania dotyczące ochrony danych.
Rozbudowując naszą bazę danych biblioteki o aspekty związane z uprawnieniami użytkowników, możemy zadać następujące pytania:
Założenia:
Dodajemy do tabeli czytelnicy kolumnę typ_konta (np. 'standard', 'premium', 'pracownik').
Pracownicy mają dodatkowe uprawnienia, np. możliwość rezerwacji książek dla innych użytkowników.
Wprowadzamy tabelę rezerwacje z polami: id, czytelnik_id, ksiazka_id, data_rezerwacji.
SELECT imie, nazwisko
FROM czytelnicy
WHERE typ_konta = 'premium';
SELECT ksiazki.tytul
FROM ksiazki
INNER JOIN rezerwacje ON ksiazki.id = rezerwacje.ksiazka_id
INNER JOIN czytelnicy ON rezerwacje.czytelnik_id = czytelnicy.id
WHERE czytelnicy.typ_konta = 'pracownik';
SELECT COUNT(*) AS liczba_rezerwacji
FROM rezerwacje
INNER JOIN czytelnicy ON rezerwacje.czytelnik_id = czytelnicy.id
WHERE czytelnicy.typ_konta = 'standard'
AND data_rezerwacji BETWEEN CURDATE() AND LAST_DAY(CURDATE() + INTERVAL 1 MONTH);
Wyjaśnienie: Zapytanie liczy rezerwacje złożone przez czytelników standardowych w bieżącym miesiącu. CURDATE() zwraca dzisiejszą datę, a LAST_DAY(CURDATE() + INTERVAL 1 MONTH) oblicza ostatni dzień bieżącego miesiąca.