Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
Wykład 1 Wojciech Pieprzyca
Systemy Baz Danych Wykład 1 Wojciech Pieprzyca
2
Organizacja zajęć 7 zajęć wykładowych (I połowa semestru)
7 zajęć projektowych (I połowa semestru) Na zajęciach 4 i 7 kolokwia będące podstawą do uzyskania zaliczenia wykładu w I terminie Projekt – oddanie projektu na zajęciach 6, obrona i ocena na zajęciach 7
3
Wprowadzenie We współczesnym świecie trudno sobie wyobrazić dobrze funkcjonujące instytucje i firmy, których działalność mogłaby być prowadzona bez korzystania z baz danych. Bowiem wszystkie inne mechanizmy, nie są w stanie konkurować pod względem szybkości i wiarygodnego dostępu do informacji z dobrze zaprojektowanym oraz prawidłowo wdrożonym systemem baz danych. Częścią około 90% wszystkich systemów informatycznych są bazy danych. Zawartość baz danych ma często kluczowe znaczenie dla strategii i działalności korporacji.
4
Architektura klient-serwer
Współczesne systemy baz danych są tworzone jako wielodostępne o architekturze klient-serwer. Architektura klient-serwer jest rodzajem systemu informatycznego, w którym dwa procesy współdziałają ze sobą jako nadrzędny i podrzędny. Proces klienta zawsze rozpoczyna współdziałanie od zgłoszenia zapotrzebowania. Proces serwera odpowiada na zgłoszone zapotrzebowanie. Odbywa się to w ten sposób, że stacja klienta przesyła zapytanie do bazy danych na ogół w języku SQL, a serwer przekazuje z powrotem gotową odpowiedź. SERWER zapytanie wynik KLIENT KLIENT KLIENT KLIENT KLIENT
5
Architektura klient-serwer
Serwer umożliwia równoczesną obsługę wielu klientów. Zasoby serwera są współdzielone pomiędzy klientów na zasadzie tworzenia odrębnych procesów dla każdego z klientów. Serwer zarządzający bazą danych zapewnia zachowanie integralności referencyjnej danych oraz chroni bazę danych przed nieuprawnionym dostępem. Na stacjach roboczych są zainstalowane aplikacje klientów odpowiedzialne za generowanie zapytań do bazy danych i obsługę interfejsu użytkownika.
6
Przykładowe SZBD Systemy bazy danych w architekturze klient-serwer to m.in.: DB2 Informix Dynamic Server Firebird Microsoft SQL Server MySQL Oracle PostgreSQL Czasem jednak stosowanie serwera nie jest konieczne. Istnieją bazy danych, które nie muszą być współdzielone przez wielu użytkowników w tym samym czasie.Do takich zastosowań używane są bezserwerowe bazy danych takie jak: Access korzystająca z silnika Microsoft Jet Kexi korzystająca z silnika SQLite
7
Terminologia ENCJA - obiekt występujący w opisywanej rzeczywistości (tabela), ATRYBUT - własność encji (pole), KROTKA – zbiór atrybutów (rekord), ZWIĄZEK – w logiczny sposób łączy ze sobą encje (związek zwany jest także relacją) TYP ATRYBUTU - zakres wartości jakie może przyjmować dany atrybut, TABELA NADRZĘDNA - tabela w której każdemu wierszowi w relacji jeden do wielu odpowiada wiele wierszy tabeli podrzędnej, TABELA PODRZĘDNA - tabela w której każdemu wierszowi odpowiada dokładnie jeden wiersz w tabeli nadrzędnej,
8
Terminologia POLE - jest najmniejszą strukturą tabeli służącą do przechowywania jednej własności tabeli . REKORD - synonim wiersza tabeli, grupa wszystkich pól występujących w tabeli, KLUCZ PODSTAWOWY- pole jednoznacznie identyfikujące każdy rekord znajdujący się w tabeli, jest unikalne, co umożliwia spełnienie warunku o niepowtarzalności rekordów w tabeli, KLUCZ OBCY - pole służące do tworzenia relacji między tabelami (powiązań między wierszami tabel), może przyjmować jedynie takie wartości jak odpowiadający mu klucz podstawowy w tabeli nadrzędnej,
9
Terminologia INDEKS - zbiór uporządkowany według określonej zasady, służący do szybkiego znajdowania rekordu z wymaganą informacją, WIDOK (perspektywa) - jest tabelą otrzymaną w wyniku zapytania SQL. Jako pola wykorzystano dane z innych tabel, zatem sam widok nie posiada własnych danych, a jedynie takie, które dostarcza mu zapytanie SQL, PROCEDURA SKŁADOWANA (stored procedure) - procedura znajdująca się na serwerze w ramach SZBD i mogąca być w dowolnej chwili wywołana, WYZWALACZ (trigger) - procedura związana z określoną tabelą znajdująca na serwerze bazodanowym. Wyzwalacze uruchamiają się automatycznie w odpowiedzi na określone zdarzenie występujące w bazie danych np. dodanie albo aktualizacja rekordu.
10
Język SQL Większość operacji wykonywanych na bazie danych odbywa się za pomocą języka SQL (Structured Query Language) – Strukturalny Język Zapytań) . W języku tym można wyróżnić trzy podstawowe zbiory instrukcji związane z pełnionymi funkcjami, są to: DDL (Data Definition Language) – zbiór instrukcji dla definiowania struktur danych używany przez administratora systemu do tworzenia wszelkich obiektów bazy danych. Na przykład: - baz danych (databases), - tabel (tables), - widoków (views), - indeksów (indexes), - wyzwalaczy (triggers), - procedur składowanych (stored procedures).
11
Język SQL DML (Data Manipulation Language) – zbiór instrukcji
używany do przeglądania, wprowadzania i modyfikacji danych przez uprawnionego użytkownika. Na przykład polecenia: DCL (Data Control Language) – zbiór instrukcji związanych z ochroną danych, na przykład polecenia: SELECT, INSERT, UPDATE, DELETE. GRANT - przydział uprawnień, REVOKE - odbieranie uprawnień.
12
Uprawnienia GRANT prawa ON nazwa_tabeli TO nazwa_uzytkownika
Poniżej podano ogólną postać poleceń nadawania i odbierania uprawnień użytkownikowi: GRANT prawa ON nazwa_tabeli TO nazwa_uzytkownika REVOKE prawa ON nazwa_tabeli TO nazwa_uzytkownika prawa{SELECT,INSERT,UPDATE,DELETE,EXECUTE,ALL}
13
Typy danych W współczesnych bazach danych stosuje się, co najmniej kilka różnych typów danych. Najczęściej używane podano w tabeli poniżej. Typ danych Zakres wartości BLOB Dane dowolnego typu w formacie binarnym SMALLINT Liczby całkowite z przedziału od –32768 do INTEGER Liczby całkowite z przedziału od – do NUMERIC(m,n) Liczba dziesiętna z określoną liczbą cyfr m przed przecinkiem i po przecinku n CHAR(n) typ znakowy o stałej długości VARCHAR(n) typ znakowy o zmiennej długości maksymalnie n znaków TIME pole do przechowywania czasu TIMESTAMP Pole do przechowywania daty i czasu
14
Indeksy Kolejnym składnikiem bazy danych są indeksy. Indeksy mają za zadanie przyspieszenie wyszukiwania informacji. Indeksy tworzy się poleceniem: Indeks może być unikalny (UNIQUE), to znaczy taki, dla którego wartości w kolumnie się nie powtarzają. Wyłączyć działanie indeksu można poleceniem: Usunięcie indeksu odbywa się poleceniem: CREATE [UNIQUE] INDEX nazwa_indeksu ON nazwa_tabeli (lista kolumn określających index); ALTER INDEX nazwa_indeksu INACTIVE ; DROP INDEX nazwa_indeksu;
15
Integralność referencyjna
Aby dane były poprawne muszą tworzyć integralną całość. Integralność danych powinna być zachowana podczas wszelkich ich modyfikacji. Jest to jeden z najpoważniejszych aspektów projektowania dobrego systemu baz danych Aby zapewnić odpowiednie połączenia (relacje) między wierszami tabel należy określić klucz podstawowy w tabeli nadrzędnej oraz klucz obcy w tabeli podrzędnej, odpowiadające sobie wiersze mają tę samą wartość klucza. Składnia polecenia jest następująca: ALTER TABLE nazwa_tabeli_podrzednej ADD CONSTRAINT nazwa_powiazania FOREIGN KEY (nazwa_pola) REFERENCES nazwa_tabeli_nadrzednej (nazwa_klucza_tabeli_nadrzednej) ON DELETE akcja;
16
Integralność referencyjna
Słowo akcja określa, co stanie się z wierszami w tabeli podrzędnej po tym jak zajdzie usunięcie wiersza w tabeli nadrzędnej. Wyróżniamy cztery rodzaje akcji: NO ACTION – nie pozwala usunąć wiersza w tabeli nadrzędnej, dopóki istnieją do niego odwołania w tabeli podrzędnej, CASCADE – usuwanie kaskadowe, usunięcie wiersza z tabeli nadrzędnej jest jednoznaczne z usunięciem wszystkich wierszy w tabeli podrzędnej odwołujących się do usuwanego wiersza z tabeli nadrzędnej, SET DEFAULT – usunięcie wiersza z tabeli nadrzędnej spowoduje ustawienie pola w tabeli podrzędnej odwołującego się tabeli nadrzędnej na wartość domyślną, SET NULL – pole wiersza (klucz obcy) odwołującego się do usuwanego wiersza w tabeli nadrzędnej, w tabeli podrzędnej otrzyma wartość NULL.
17
Zawartość tabeli systemowej
Tabele systemowe Interbase i FireBird przechowują informacje o strukturze bazy danych w specjalnych tabelach systemowych w tak zwanym katalogu. Informacje z tabel systemowych można uzyskać tworząc odpowiednie zapytanie w języku SQL analogicznie jak to ma miejsce w przypadku zwykłych tabel. Tabela systemowa Zawartość tabeli systemowej RDB$CHECK_CONSTRAINTS informacje o ograniczeniach CHECK oraz o kolumnach NOT NULL RDB$DATABASE opis bazy danych opis tabel i kolumn z których korzystają inne obiekty bazy danych jako widoki, procedury, wyzwalacze,i kolumny wyliczane RDB$DEPENDENCIES RDB$EXCEPTIONS opis błędów procedur oraz wyjątków RDB$FIELD_DIMENSIONS opis wymiarów tablicy zastosowanej jako typ dlakolumny RDB$FIELDS opis właściwości wszystkich kolumn tabeli RDB$FILES opis dodatkowych plików bazy danych oraz plików z kopią bazy RDB$FUNCTION_ARGUMENTS opis parametrów funkcji, ich pozycji, typu, długości, etc.
18
Zawartość tabeli systemowej
Tabele systemowe Tabela systemowa Zawartość tabeli systemowej RDB$FUNCTIONS opis funkcji zdefiniowanych przez użytkownika RDB$GENERATORS informacje o generatorach RDB$INDEX_SEGMENTS opis indeksów złożonych z kilku kolumn RDB$INDICES opis dla indeksów prostych i złożonych RDB$PAGES opis alokacji stron dla bazy danych RDB$PROCEDURE_PARAMETERS opis parametrów procedury bazy danych RDB$PROCEDURES informacje o procedurach RDB$REF_CONSTRAINTS opis ograniczeń integralności referencyjnej RDB$RELATION_CONSTRAINTS opis ograniczeń o integralności danych tabeli RDB$RELATION_FIELDS opis kolumn wszystkich tabel RDB$RELATIONS opis tabel i widoków RDB$ROLES opis roli i właściwości roli RDB$TRIGGER_MESSAGES informacje o wyzwalaczu i jego komunikat RDB$TRIGGERS opis zdefiniowanych wyzwalaczy RDB$PRIVILEGES informacje o prawach użytkowników
19
Wyjątki W skrypcie SQL wyjątki definiowane są przez wywołanie:
Wyjątki są wywoływane przez system w wyniku powstania określonego błędu występującego w czasie pracy z bazą danych. Tworzy się je w następujący sposób: CREATE EXCEPTION nazwa_wyjatku ‘komunikat_o_bledzie’ ; W skrypcie SQL wyjątki definiowane są przez wywołanie: EXCEPTION: WHEN SQLCODE numer_bledu DO EXCEPTION nazwa_wyjatku;
20
Transakcje Transakcja polega na wykonaniu pewnego ciągu poleceń, które mogą zakończyć się albo całkowitym wykonaniem i przejściem w nowy stan albo anulowaniem wszelkich zmian i pozostaniem w dotychczasowym stanie. Przykładem transakcji jest np. wypłata pieniędzy z konta bankowego. Transakcja rozpoczyna się poleceniem START TRANSACTION. W przypadku całkowitego poprawnego wykonania transakcji wywoływana jest funkcja COMMIT TRANSACTION, która zatwierdza wszystkie zmiany w bazie. W razie niepowodzenia wykonania jakiekolwiek części transakcji, wszelkie zmiany są anulowane poprzez wywołanie funkcji ROLLBACK.
21
Procedury zapamiętane
Wyróżniamy dwa rodzaje procedur zapamiętanych: procedury wykonawcze, procedury wybierające, które występują w głównie w postaci zapytań języka SQL i zwracają zbiór wierszy. Dodatkową zaletą tych procedur jest ich fizyczne umieszczenie tylko na jednym komputerze, co w przypadku zmian powoduje konieczność modyfikacji kodu tylko w jednym, konkretnym miejscu, a nie dla każdego klienta.
22
Procedury zapamiętane
Składowane procedury są przechowywane w pliku bazy danych. Umożliwiają one bezpośrednie manipulowanie danymi w bazie danych, bez generowania ruchu sieciowego. W odróżnieniu od tradycyjnych środowisk programistycznych, w których programy wykonują się u klienta, procedury składowane są wykonywane przez serwer bazy danych i wykonują się całkowicie na serwerze. Najprostszą metodą wykonania składowanej procedury jest użycie wyrażenia: Wywołanie procedury wybierającej możliwe jest z poziomu języka SQL poprzez odpowiednie zapytanie: EXECUTE PROCEDURE nazwa_procedury(parametry); SELECT * FROM nazwa_procedury(parametry);
23
Procedury zapamiętane
Usunięcie procedury następuje po wydaniu polecenia: Procedury składowane można uruchamiać w następująco: z programów użytkowych i procedur składowanych; z wnętrza wyzwalacza; z wnętrza aplikacji, takiej jak na przykład C++Builder; jako zapytanie SELECT języka SQL. DROP PROCEDURE nazwa_procedury;
24
Procedury zapamiętane
Procedura ma postać ciągu instrukcji języka proceduralnego. Do każdej procedury mogą być przekazane parametry. Procedura może nadawać wartości parametrom zwrotnym deklarowanym po klauzuli RETURNS. Wewnątrz procedury można używać zmiennych pomocniczych deklarowanych po klauzuli AS. Składowane procedury są tworzone za pomocą wyrażenia CREATE PROCEDURE języka SQL. Wyrażenie to ma następującą składnię: CREATE PROCEDURE nazwa_procedury [(parametry)] RETURNS [lista parametrów zwrotnych] AS [zmienne lokalne] BEGIN ciało procedury END
25
Procedury zapamiętane
Nazwa procedury musi być unikalna w bazie danych. Składa się ona z ciągu liter, cyfr i znaków podkreślenia. Nazwa powinna rozpoczynać się od litery. Duże i małe litery w nazwie są nierozróżnialne. Lista parametrów jest ciągiem zmiennych, które są przekazywane do procedury z aplikacji wywołującej. Parametry te są wykorzystywane wewnątrz procedury. Lista parametrów zwrotnych reprezentuje wartości, które procedura może zwracać z powrotem do aplikacji wywołującej. Lista parametrów i lista parametrów zwrotnych mają następujący format: Nazwa_parametru_1 typ_parametru_1 [,Nazwa_parametru_2 typ_parametru_2,..]
26
Procedury zapamiętane
Przekazywane oraz zwracane parametry znajdujące się w treści procedury muszą być dodatkowo poprzedzone znakiem dwukropka. Po słowie kluczowym AS można zadeklarować zmienne o zakresie lokalnym. Zmienne te są widoczne tylko wewnątrz procedury i są niszczone po zakończeniu jej działania. Zmienne lokalne deklaruje się po klauzuli AS przy pomocy wyrażenia DECLARE VARIABLE. Poniżej podano przykład deklaracji dwóch zmiennych. Typem parametru lub zmiennej lokalnej może być dowolny typ danych, oprócz typu BLOB i typów tablicowych. DECLARE VARIABLE nazwa CHAR(20); DECLARE VARIABLE kwota NUMERIC(12,2);
27
Procedury zapamiętane
Poniżej podano dopuszczalne typy danych: dopuszczalny typ danych ::= SMALLINT | INTEGER | FLOAT | DOUBLE PRECISION | DECIMAL | NUMERIC [(precyzja [,skala])] | DATE | TIME | TIMESTAMP | CHAR | VARCHAR [(INT)][CHARACTER SET WIN1250]
28
Procedury zapamiętane
Ciało procedury rozpoczyna się słowem kluczowym BEGIN, a kończy się słowem END. Ciało procedury składa się z ciągu instrukcji języka SQL poprzeplatanych słowami języka proceduralnego przypominającego „Pascal”. Jest to ta część języka SQL, która umożliwia manipulowanie danymi. Umożliwia to, budowanie wyrażeń warunkowych oraz instrukcji pętli. Wewnątrz procedur można używać następujących polecenia języka SQL: INSERT UPDATE DELETE SELECT
29
Procedury zapamiętane
SET TERM ^ ; CREATE PROCEDURE WARTOSC RETURNS ( R_ID_TOW INTEGER, R_TOWAR CHAR(20), R_WARTOSC NUMERIC(8, 2) ) AS BEGIN FOR SELECT ID_TOWARU, NAZWA_TOWARU, ILOSC*CENA FROM TOWARY INTO :R_Id_Tow, :R_Towar, :R_WARTOSC DO SUSPEND; END ^ SET TERM ; ^ COMMIT WORK; Jeżeli w bazie danych, jest umieszczona tabela TOWARY, to uruchomienie tej procedury następuje z programu narzędziowego IBConsole lub ISQL poleceniem: SELECT * FROM Wartosc;
30
Procedury zapamiętane
Wynik działania procedury R_Id_Tow R_Towar R_Wartosc 23 Cukier 4000 25 Kawa 8250 16 Sok jabłkowy 1250 17 Napój Frugo 5040 33 Sok pomarańczowy 975
31
Procedury zapamiętane
Słowa kluczowe BEGIN i END mogą być również wykorzystane do zaznaczenia dowolnego bloku kodu wszędzie tam, gdzie wymagane jest użycie pojedynczego wyrażenia. Blok kodu składa się z ciągu instrukcji logicznie stanowiących jedną całość, taką jak na przykład instrukcja wykonywana wewnątrz pętli. Bloki kodu mogą być stosowane do grupowania instrukcji w dowolnych miejscach procedur. Bloki kodu BEGIN..END mogą być zagnieżdżane wewnątrz innych bloków. Blok kodu ma następującą składnię: BEGIN Wyrażenie SQL END
32
Procedury zapamiętane
Instrukcja FOR SELECT..DO wykonuje blok kodu lub wyrażenie dla każdego wiersza zwróconego przez zapytanie SELECT. Polecenie SUSPEND zatrzymuje działanie procedury aż do momentu pobrania kolejnego wiersza z tabeli. Składnia instrukcji FOR SELECT jest następująca: FOR SELECT * | Lista atrybutów FROM Nazwa tabeli | Lista polaczonych tabel WHERE Warunek wyboru wierszy INTO Lista parametrów zwrotnych> DO BEGIN Ciag Instrukcji; SUSPEND; END
33
Procedury zapamiętane
Podobnie jak w innych językach programowania, przy tworzeniu procedury składowanej można posłużyć się wyrażeniem wykonywanym warunkowo. Służy do tego instrukcja IF..ELSE. Struktura tej instrukcji jest następująca: Jeżeli warunek jest prawdziwy, to wykonywane jest wyrażenie SQL_1, w przeciwnym przypadku realizowane jest wyrażenie SQL_2. IF (warunek) THEN Wyrazenie SQL_1; ELSE Wyrazenie SQL_2;
34
Procedury zapamiętane
Pętla WHILE działa według podobnej zasady jak w języku C. Ogólna struktura tej pętli jest następująca: Wyrażenie SQL jest tak długo powtarzane jak długo warunek jest prawdziwy. Wyrażenie powinno zawierać kod, który sprawi, że warunek sterujący działaniem pętli przyjmie ostatecznie wartość fałszywą. Jeżeli ten kod zostanie pominięty, to pętla będzie wykonywana w nieskończoność, co będzie wyglądało jak zawieszenie się programu. WHILE(warunek)wyrazenie_SQL;
35
Procedury zapamiętane
SET TERM ^ ; CREATE PROCEDURE CENY ( P_NOWA_CENA NUMERIC(8, 2), P_STATUS CHAR(10) ) RETURNS R_STATUS CHAR(10), R_NAZWA CHAR(12), R_CENA_NETTO NUMERIC(8, 2), R_CENA_SPRZED NUMERIC(8, 2), R_VAT NUMERIC(8, 2) AS DECLARE VARIABLE i INTEGER; DECLARE VARIABLE Cen NUMERIC(8, 2); BEGIN i = 1; WHILE (i < 3) DO
36
Procedury zapamiętane
BEGIN FOR SELECT 'Stara cena', NAZWA_TOWARU, CENA, CENA*(1+VAT), VAT FROM TOWARY INTO :R_Status, :R_Nazwa, :R_Cena_Netto, :R_Cena_Sprzed, :R_VAT DO IF (i=2) THEN Cen = R_Cena_Netto; R_Status = P_Status; R_Cena_Netto = Cen * P_Nowa_Cena; R_Cena_Sprzed = Cen * P_Nowa_Cena * (1 + R_VAT)*1.05; END SUSPEND; i = i + 1; END ^ SET TERM ; ^ COMMIT WORK;
37
Procedury zapamiętane
Po uruchomieniu procedury poleceniem: Otrzymuje się w wyniku następującą tabelę: SELECT * FROM CENY(1.2,’Nowa cena’); R_Status R_Nazwa R_Cena_Netto R_Cena_Sprzed VAT Stara cena Cukier 2.00 2.14 0.07 Kawa 5.50 6.71 0.22 Olej sojowy 5.00 5.35 Kakao 8.00 8.56 Margaryna 1.50 1.83 Nowa cena 2.40 2.70 6.60 8.45 6.00 6.74 9.60 10.79 1.80 2.31
38
Procedury zapamiętane
Procedury zapamiętane powinny być stosowane w następujących przypadkach: Jeżeli operacja może być wykonana w całości na serwerze, bez wymogu pozyskania informacji od użytkownika podczas trwania operacji. Jeśli operacja wymaga przetworzenia dużej ilości wierszy, co mogłoby być nadmiernie kosztowne w kategoriach ruchu sieciowego. Jeśli operacja musi być wykonywana okresowo lub często. Jeśli operacja jest wykonywana przez wiele różnych modułów lub procesów wewnątrz aplikacji lub przez różne aplikacje. Jeśli logika operacji często się zmienia.
39
Projekt – model logiczny
Legenda: NO – pole typu autoincrement, używane zazwyczaj dla pól id, VA40 – pole typu tekstowego VARCHAR o maksymalnej długości 40 znaków A5 – pole typu tekstowego CHAR o maksymalnej długości 5 znaków I – pole typu liczba całkowita (INTEGER) F – pole typu liczba rzeczywista (FLOAT) D – pole typu data (DATE) BL – pole typu logicznego (BOOLEAN) PI – primary identifier – klucz główny M – mandatory – pole obowiązkowe
40
Projekt – rodzaje relacji
Relacja 1:1 – jeden do jednego Przykład: relacja pomiędzy tabelą pracownik i samochód przy założeniu, że pracownik może mieć tylko jeden samochód i każdy samochód jest przyporządkowany tylko do jednego pracownika Relacja 1:N – jeden do wielu Przykład: klient może dokonać wielu rezerwacji. Z drugiej strony każda rezerwacje dotyczy tylko jednego konkretnego klienta. Relacja N:N – wiele do wielu Przykład: zamawiającym pozycję z menu jest klient posiadający rezerwacje, może on zamówić dowolnie wiele pozycji, z drugiej strona każda z pozycji menu może być zamówiona przez wielu klientów (posiadających rezerwacje) naraz. Okrąg oznacza opcjonalność danej relacji np. klient może ale nie musi zamówić czegoś z menu restauracyjnego.
41
Projekt – model fizyczny
W modelu fizycznym typy danych zostały odzwierciedlone na rzeczywiście występujące w programie MS Access. Relacje zostały uwzględnione w postaci tzw. kluczy obcych, które pozwalają na łączenie tabel ze sobą np. w tabeli Rezerwacje pojawiły się pola id_klienta, id_pokoju i id_pracownika. Dla relacji N:N (wiele do wielu) dodatkowo tworzone są pośrednie tabele (w przypadku naszego projektu powstała tabela ZamowieniaMenu). <pk> - primary key – klucz główny <fk> - foreign key – klucz obcy
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.