Ćwiczenie10, Sprawozdania, Instrukcje labolatoryjne


WSTĘP

Model danych służy do przedstawiania struktury danych projektowanego lub istniejącego systemu. Przez strukturę danych rozumiemy typy danych występujących
w systemie, wzajemne powiązania miedzy nimi i ograniczenia na nie nałożone. W zależności od pojęć jakimi są opisywane dane, istnieje wiele modeli:

  1. Relacyjny;

  2. Sieciowy

  3. Hierarchiczny.

Najpopularniejszym modelem konceptualnym danych jest model związków obiektów (model ER), którego graficzne przedstawienie - Entity Relationship Diagram (w skrócie ERD) służy do schematycznego przedstawiania struktury danych projektowanego lub istniejącego systemu.

Obiekt, związek, atrybut

Podstawowymi pojęciami modelu ER są: obiekt, związek i atrybut. Obiekt jest pojęciem pierwotnym, jest to coś co istnieje i jest rozróżnialne. Potrafimy odróżnić jeden obiekt od drugiego. Obiekty mogą być rzeczywiste, mogą też być pewnymi pojęciami abstrakcyjnymi. Obiekty maja swoje własności zwane atrybutami. Przykładem może być obiekt KLIENT i jego atrybuty: IMIĘ, NAZWISKO, WIEK. Związki pomiędzy obiektami przedstawiają powiązania w świecie rzeczywistym - na przykład obiekt ZAMÓWIENIE składa się z wielu obiektów POZYCJA ZAMÓWIENIA.

Schematy ERD są przedstawiane w wielu notacjach. Nas będą interesowały dwie z nich: notacja Chena i notacja Martina, zwana inaczej notacją wronich łapek.

0x08 graphic

0x08 graphic
Rys.1 Przedstawienie powiązania obiektów w notacji Martina

Rys.2 Przedstawienie powiązania obiektów w notacji Chen'a

Jak można zauważyć w przedstawionych powyżej przykładach obiekty przedstawiane są na schematach za pomocą prostokątów, a powiązania jako linie uzupełnione przez pewne symbole. Oznaczenia te ulegają zmianie w zależności od charakterystyki powiązań. Pełny wykaz symboli przedstawiony został w dodatku A dla notacji Martina i w dodatku B dla notacji Chena.

Rodzaje powiązań

Charakter powiązań miedzy obiektami określają:

0x08 graphic

Rys.3 Przykładowe powiązania pomiędzy obiektami

W przykładzie przedstawionym na rys.3 każda osoba ma dokładnie jeden paszport
i zawsze paszport należy do jednej konkretnej osoby. W drugim przypadku mamy następujące przyporządkowanie: katalog może zawierać wiele plików, natomiast plik należy tylko do jednego katalogu; katalog może istnieć bez żadnego pliku (występowanie pliku opcjonalne), jeżeli zaś występuje plik to musi należeć do konkretnego katalogu (występowanie katalogu obligatoryjne). W trzecim przykładzie: jeden typ wyrobu może występować w wielu magazynach, jak również jeden magazyn może oferować wiele typów wyrobów
i występowanie zarówno obiektu Magazyn jak i obiektu Wyrób jest obligatoryjne. Kolejny przykład to powiązanie pomiędzy książką i czytelnikiem. Czytelnik może wypożyczyć wiele książek i książka może być wypożyczona przez wielu czytelników. Występowanie pewnej pozycji zarówno w obiekcie Czytelnik, jak i w obiekcie Książka nie wymusza występowania odpowiedniej pozycji w drugim z nich dlatego zaznaczona opcjonalność po każdej ze stron.

Etapy projektowania bazy danych (tworzenia schematu ERD)

Na przykładzie sytemu obsługi zamówień zostaną pokazane poszczególne etapy tworzenia modelu danych. Założenia modelu są następujące:

Etap 1

Analizując założenia projektowanego systemu określamy zbiór pewnych identyfikatorów, zwykle atrybutów, które w jednoznaczny sposób określają obiekty istniejące w systemie. Na przykład: numer zamówienia, numer klienta, kod wyrobu, kod rejonu, kod magazynu. Znajomość tych identyfikatorów umożliwi nam określenie następujących obiektów: zamówienie, klient, wyrób, rejon, magazyn.

Etap 2

Po wyodrębnieniu obiektów w systemie należy zidentyfikować na podstawie reguł panujących w projektowanym systemie bądź założeń jego dotyczących, bezpośrednie powiązania występujące między nimi. Konieczne jest zbadanie istnienia bezpośrednich powiązań między poszczególnymi obiektami. Sprawdzamy powiązania każdy z każdym. Proces ten upraszcza niekiedy utworzenie tablicy krzyżowej.

Obiekt

Klient

Wyrób

Rejon

Magazyn

Zamówienie

Klient

X

X

Wyrób

X

X

Rejon

X

Magazyn

Zamówienie

Rys4. Tablica krzyżowa obiektów w systemie; X oznacza istnienie bezpośredniego powiązania.

Po ustaleniu powiązań należy zbadać ich cechy charakterystyczne: liczebność i opcjonalność. Po przyprowadzeniu analizy przechodzimy do następnego etapu.

Etap 3

0x08 graphic
Po zidentyfikowaniu obiektów i określeniu powiązań pomiędzy nimi możemy przedstawić wstępny schemat ERD naszego systemu.

Rys.5 Wstępny schemat przykładowego systemu

Etap 4

Jak łatwo zauważyć na rysunku 5 powiązania obiektów Magazyn-Wyrób i Zamówienie-Wyrób są powiązaniami wiele do wielu czyli M:N i muszą zostać rozbite na dwa powiązania typu 1:N przez wprowadzenie dodatkowego obiektu. Po takim przekształceniu nasz schemat wygląda następująco:

0x08 graphic

Rys.6 Schemat ERD po usunięciu powiązań typu M:N

Każdy z obiektów przedstawiony na schemacie powinien być zdefiniowany, zidentyfikowane muszą być wszystkie atrybuty obiektów.

Etap5

Na koniec należy sprawdzić zgodność naszego modelu z założeniami projektowanego systemu i ustalić czy jest on w stanie spełnić wymagania użytkownika. Jest to weryfikacja ogólna. Szczegółowej weryfikacji dokonuje się w trakcie tworzenia tzw. szkieletów procesów. Podstawą weryfikacji ogólnej modelu są następujące reguły:

Tworzenie tabel w Delphi

Wraz z Delphi dostarczane są narzędzia wspomagające tworzenie struktur tabel relacyjnych baz danych. Należą do nich Database Desktop i SQL Explorer. Database Desktop pozwala na tworzenie tabel w oparciu o sterowniki dostarczane z pakietem Delphi. Pozwala również na budowanie zapytań SQL, które można później wykorzystać w aplikacji.

Wykorzystanie Database Desktop do tworzenia tabel i zapytań SQL

Database Desktop umożliwia tworzenie tabel standartowych typów baz danych. Utworzenie nowej tabeli realizuje się poprzez wykonanie polecenia menu File|New|Table. Następnie podajemy rodzaj tabeli z listy rozwijalnej okna, które pojawia się jako pierwsze po wykonaniu powyższego polecenia. Po wybraniu określonego typu pojawi się okno dialogowe Create Table.

Po lewej stronie okna znajduje się obszar w którym określa się pola tworzonej tabeli. Dla tabel różnego typu należy następnie w różny sposób zdefiniować typy pól. Każde nowe pole tabeli będziemy określać podając:

Pola dla tabel dBase

Przy nazywaniu pól należy stosować się do poniższych zasad:

Typy pól

Symbol

Rozmiar

Typ

Opis

C

1-254

Charakter

Pole tego typu może zawierac dowolne znaki włączając w to spację. Maksymalnie pole to może przechowywać do 254 znaków.

F

1-20

Float

Pole to przechowuje wartości zmiennoprzecinkowe. Ilość miejsc dziesiętnych od 0 do 18.

N

1-20

Number

Pole to przechowuje dane numeryczne kodowane w formacie BCD

D

Date

Pole typu Date przechowuje datę. Pomyślnie data wyświetlona jest w formacie skróconym. Format daty można zmienić uustalając go w ustawieniach regionalnych systemu. Rozmiar pola data jest zawsze równy 8.

L

Logical

Pole zawiera pojedynczy znak wskazujący na wartość logiczną. Pola te przyjmują wartości:

T, t, Y, y dla określenia prawdy;

F, f, N, n dla określenia fałszu. Rozmiar pola logicznego zawsze równy 1.

M

M

Pole to zawiera bloki tekstu za duże do przechowywania jako typ znakowy. Dane pola memo przechowywane są w osobnym pliku.

Indeksy

Podczas tworzenia indeksu do tabeli dBase Database Desktop tworzy plik, który zawiera zaindeksowane wartości pól wraz z ich korespondującymi numerami rekordów. Database Desktop umożliwia tworzenie plików indeksowych za pomocą opcji DEFINE INDEXES. Po uruchomieniu podajemy pole według którego chcemy indeksować (mówiąc prosto pole według którego chcemy sortować naszą tabelę).

Aliasy

Aliasy zapewniają użytkownikowi dostęp do bazy danych. Można go utworzyć wykorzystując program DatabaseDesktop. Uruchamiając opcję Tools|Alias Manager otwieramy okienko tworzenia aliasu. Wybieramy opcję New i w miejsce nazwy podajemy własną. Zmieniamy ścieżkę dostępu na ścieżkę do katalogu, gdzie są umieszczone nasze tabele i zapisujemy.

Komponenty bazodanowe

Podstawowe właściwości komponentu Table:

Exclusive - blokuje daną tabelę dla wyłącznego użytku przez daną aplikację

IndexDefs - zawiera informacje o ondexach tabeli

IndexFieldCount - liczba pól tworzących bieżący klucz

IndexName- służy do wyspecyfikowania indeksu dla tabeli

MasterFields- pole używane do łączności pomiędzy tabelą główną (master) i szczegółową (details)

MasterSource - Wskazanie na komponent DataSource powiązany z tabelą pełniącą rolę tabeli głównej (master dla niniejszej tabeli).

ReadOnly - Określa czy dana tabela jest otwarta tylko do odczytu.

TableName - nazwa tabeli w bazie danych.

DatabaseName- powiązanie do wykorzystywanej bazy danych.

Filter - obsługuje filtry w tabelach bazy danych.

Filtered - zatwierdza wykorzystanie mechanizmu filtrowania.

Właściwości komponentów bazodanowych:

Active

Po ustawieniu na True otwiera zbiór danych po ustawieniu na False zamyka ten zbiór.

AutoCalcFields

Określa czy pola obliczane powinny być obliczane automatycznie.

Bof

Zwraca wartość True jeżeli kursor znajduje się w pierwszym rekordzie
w zbiorze danych i wartość False w przeciwnym wypadku.

CachedUpdates

Przy wartości True wszystkie uaktualnienia są zapisywane wbuforze komputera klienta, aż do momentu całkowitego zakończenia transakcji. Przy wartości False wszelkie zmiany w bazie danych są wykonywane rekord po rekordzie.

CanModify

Określa czy użytkownik może dokonywać edycji danych zbioru danych.

DataSource

Wskazuje komponent DataSource skojarzony ze zbiorem danych.

DatabaseName

Nazwa aktualnie używanej bazy danych (aliasu).

Eof

Zwraca True jeżeli kursor znajduje się na końcu pliku i False w przeciwnym wypadku.

FieldCount

Liczba pól w zbiorze danych. Ze względu na to ,że zbiór danych może mieć charakter dynamiczny, liczba pól może ulegać zmianie pomiędzy kolejnymi wywołaniami.

Fields

Tablica obiektów Tfields zawierająca informację o polach w zbiorze danych.

FieldValues

Zwraca wartość określonego pola w bieżącym rekordzie.

Filter

Wyrażenie określające kryterium, według którego dany rekord zbioru danych jest widoczny dla użytkownika.

Filtered

Określa czy ma zastosowanie filtrowanie rekordów. Przy wartości True zbiór danych jest filtrowany na podstawie właściwości Filter oraz zdarzenia OnFilterRecord. Przy wartości widoczne są wszystkie rekordy zbioru.

FilterOptions

Określa sposób stosowania filtrów.

Found

Informuje o powodzeniu lub niepowodzeniu operacji szukania.

Handle

Określa uchwyt kursora BDE do zbioru danych. Stosowany jest jedynie
w przypadku bezpośrednich odwołań do BDE.

Modified

Określa czy bieżący rekord był modyfikowany czy nie.

RecNo

Zwraca numer bieżącego rekordu w zbiorze danych.

RecordCount

Określa liczbę rekordów w zbiorze danych.

State

Zwraca bieżący stan zbioru danych (dsEdit, dsBrowse, dsInsert).

UpdateObject

Wskazuje komponent TupdateObject używany w przypadku buforowanego uaktualnienia bazy danych.

UpdatePending

Wartość True oznacza, że bufor uaktualnień zawiera zmiany nie wprowadzone jeszcze do bazy danych.

Metody komponentów bazodanowych

Append

Tworzy pusty rekord i dołącza go na końcu zbioru danych.

AppendRecord

Dodaje rekord z wypełnionymi polami danych na końcu zbioru danych i wysyła jego wartość do bazy danych.

ApplayUpdates

Nakazuje bazie danych wprowadzenie wszelkich oczekujących zmian. Zmiany te są dokonywane dopiero w chwili wywoływania funkcji CommitUpdates

Cancel

Anuluje wszelkie zmiany dokonywane w bieżącym rekordzie, o ile nie zostały one wysłane jeszcze do bazy danych.

CancelUpdates

Anuluje wszelkie zmiany oczekujące w buforze.

ClearFields

Czyści zawartość wszystkich pól bieżącego rekordu.

CommitUpdates

Zmusza bazę danych do dokonania wszelkich uaktualnień i czyści bufor uaktualnień.

Close

Zamyka zbiór danych.

Delete

Usuwa bieżący rekord

DisableControls

Dezaktywuje wszelkie komórki wprowadzania związane ze zbiorem danych.

Edit

Wprowadza bieżący rekord w stan edycji.

EnableControls

Udostępnia wszelkie komórki wprowadzania związane ze zbiorem danych.

FetchAll

Pobiera wszelkie rekordy od miejsca wskazanego przez kursor do końca zbioru danych i zapisuje je w sposób lokalny.

FieldByName

Pobiera nazwę pola i zwraca odpowiadający mu wskaźnik klasy Tfield.

FindFirst

Znajduje pierwszy rekord według bieżących kryteriów filtrowania.

FindNext

Znajduje kolejny rekord według bieżących kryteriów filtrowania.

FindLast

Znajduje ostatni rekord według bieżących kryteriów filtrowania.

FindPrior

Znajduje poprzedni rekord według bieżących kryteriów filtrowania.

First

Przesuwa kursor na pierwszy rekord w zbiorze danych.

FreeBookmark

Usuwa zakładkę ustawioną wcześniej przy użyciu funkcji GetBookmark i zwalnia przydzieloną jej pamięć.

GetBookmark

Ustawia zakładkę na bieżącym rekordzie.

GetFieldNames

Wyszukuje listę nazw pól w zbiorze danych.

GotoBookmark

Umieszcza kursor w rekordzie wskazywanym przez określoną zakładkę.

Insert

Wstawia rekord i ustawia dane w tryb edycji.

InsertRecord

Wstawia rekord do zbioru danych i wypełnia jego pola wartościami oraz zapisuje je do bazy danych.

Last

Umieszcza kursor w ostatnim rekordzie w bazie danych.

Locate

Przeszukuje zbiór danych w poszukiwaniu określonego rekordu.

Lookup

Lokalizuje rekord w najszybszy możliwy sposób i zwraca zawarte w nim dane.

MoveBy

Przesuwa kursor o określoną liczbę wierszy.

Next

Przemieszcza kursor do następnego rekordu.

Open

Otwiera zbiór danych.

Post

Zapisuje poddane edycji dane do bazy danych lub bufora modyfikacji.

Prior

Przemieszcza kursor do poprzedniego rekordu.

Refresh

Uaktualnia zbiór danych informacjami z bazy danych

RevertRecord

Jeżeli aktywny jest mechanizm buforowania uaktualnień, cofa zmiany wprowadzone do rekordu, ale nie zapisane jeszcze do bazy danych.

SetFields

Ustawia wartości wszystkich pól w rekordzie

UpdateStatus

Zwraca bieżący status uaktualnienia gdy dostępny jest mechanizm buforowania uaktualnień.

Tworzenie prostej aplikacji obsługi bazy danych w Delphi

  1. Do formularza dodaj komponent Table.

  2. Znajdź właściwość DatabaseName w Inspektorze obiektów i wybierz odpowiednią bazę danych lub wpisz ścieżkę dostępu do swojej.

  3. Znajdź właściwość TableName i wybierz odpowiednią tabelę. W tym miejscu powinna pojawić się lista tabel twojej bazy danych.

  4. Umieść na formularzu komponent DataSource i ustaw jego właściwość DataSet na Table1(tą wartość również możesz wybrać z rozwijanej listy. W ten sposób źródło danych zostanie połączone ze zbiorem danych.

  5. Dodaj do formularza komponent DBGrid i zmień jego właściwość DataSource na DataSource1. W ten sposób wizualny komponent prezentacji zostanie połączony ze źródłem danych i (pośrednio) ze zbiorem danych.

  6. Powróć do komponentu Table i zmień jego włąściowść Active na True.

  7. Dodaj do formularza komponent DBNavigator i zmień jego właściwość DataSource na DataSource1. W ten sposób wizualny komponent manipulacji danymi zostanie połączony ze źródłem danych i (pośrednio) ze zbiorem danych.

  8. Zapisz i uruchom w ten sposób stworzony projekt

Filtry

Aby dokonać operacji filtrowania we właściwości Filter umieszcza się nazwę pola, operator logiczny i wartość. Dodatkowo właściwość Filtered należy ustawić na True. Przykładowo filtr może wyglądać następująco:

Imie = `Jan'

Imie = `Jan' and Nazwisko = `Kowalski'

W wyrażeniach określających filtry można stosować wszystkie operatory relacji oraz operatory logiczne AND, OR, NOT.

Dodatkowy aspekt filtrowania określa właściwość FilterOptions. Jest to właściowość zbiorowa, na którą składają się dwie opcje: foCaseIntensitive i FoPartialCompare. Obecność pierwszej z nich powoduje, że w wyrażeniu filtrującym nie są rozróżniane małe i duże litery. Druga z nich powoduje traktowanie * jako znaku blankietowego bądź nie.

Sortowanie rekordów

Sortowanie rekordów tabeli można w prosty sposób zrealizować wykorzystując wcześniej stworzone pliki indeksowe. Ustawienie właściwości IndexName spowoduje nam odpowiednie uporządkowanie danych w tabeli.

Wyszukiwanie rekordów

Do przeszukiwania zbiorów danych można wykorzystać następujące metody:

FindFirst

FindNext

FindPrior

FindLast

FindKey

GotoKey

Locate

Lookup

Ustawianie relacji master/details

Ustawienie relacji master/detail umożliwia nam wiązanie danych znajdujących się w dwóch tabelach bazy danych. Załóżmy, że mamy tabelę o nazwie klient przechowującą dane o klientach, która jest poindeksowana według nr_klienta oraz tabelę zamówienia zawierającą listę wszystkich zamówień złożonych przez klientów. Ta tabela musi być również poindeksowana według nr_klienta. Tworząc relację master/detail przeglądając tabelę klientów można jednocześnie w drugiej tabeli oglądać złożone przez klienta zamówienia. Aby uzyskać taki efekt należy zdefiniować tabelę Klientów jako Master, natomiast tabelę Zamówień jako Details.

  1. Do formularza dodaj po dwa komponenty Table, DataSource, DBGrid.

  2. Dla Table1 znajdź właściwość DatabaseName w Inspektorze obiektów i wybierz odpowiednią bazę danych lub wpisz ścieżkę dostępu do swojej.

  3. Znajdź właściwość TableName i wybierz odpowiednią tabelę. W tym miejscu powinna pojawić się lista tabel twojej bazy danych.

  4. Dla komponentu DataSource1 ustaw właściwość DataSet na Table1(tą wartość również możesz wybrać z rozwijanej listy. W ten sposób źródło danych zostanie połączone ze zbiorem danych.

  5. Dla komponentu DBGrid1 zmień właściwość DataSource na DataSource1. W ten sposób wizualny komponent prezentacji zostanie połączony ze źródłem danych i (pośrednio) ze zbiorem danych.

  6. Powróć do komponentu Table1 i zmień jego właściowść Active na True.

  7. Dla Table2 znajdź właściwość DatabaseName w Inspektorze obiektów i wybierz odpowiednią bazę danych lub wpisz ścieżkę dostępu do swojej.

  8. Znajdź właściwość TableName i wybierz odpowiednią tabelę. W tym miejscu powinna pojawić się lista tabel twojej bazy danych.

  9. Dla komponentu DataSource2 ustaw właściwość DataSet na Table2(tą wartość również możesz wybrać z rozwijanej listy. W ten sposób źródło danych zostanie połączone ze zbiorem danych.

  10. Dla komponentu DBGrid2 zmień właściwość DataSource na DataSource2. W ten sposób wizualny komponent prezentacji zostanie połączony ze źródłem danych i (pośrednio) ze zbiorem danych.

  11. Powróć do komponentu Table2 i zmień jego właściwość Active na True.

  12. W tym momencie na formularzu mamy wyświetlone dwie niezależne tabele. Ustal, która z nich ma być tabelą główną (master), która natomiast uzupełniającą (details). Dla tabeli uzupełniającej ustaw właściwość MasterSource na DataSource1 lub DataSource2 w zależności od tego, która z tabel jest główną.

  13. Następnie kliknij przycisk wielokropka przy właściwości MasterFields. Zostanie otwarte okno Projektanta Połączeń.

  14. U szczytu okna znajduje się pole listy rozwijanej o nazwie Available Indexes. Wybierz index według którego chcesz łączyć tabele.

  15. W polach obu list powinien pojawić się ten sam index. Wybierz index w każdej z list i kliknij przycisk Add aby utworzyć związek master/detail. Lista pól połączonych pokazuje teraz, że dwie tabele są połączone przez odpowiednie ich pola.

  16. Zamknij okno Projektanta Połączeń klikając OK.

  17. W tabeli głównej powinny zostać wyświetlone wszystkie dane, natomiast tabela uzupełniająca powinna wyświetlać tylko dane dotyczące odpowiedniego rekordu tabeli głównej.

  18. Zapisz i uruchom w ten sposób stworzony projekt

Cel ćwiczenia

Celem ćwiczenia jest zapoznanie się z ideą baz danych, sposobem ich projektowania
i organizacji oraz możliwościami oprogramowania bazy danych w Delphi.

Przebieg ćwiczenia

1

15

0x01 graphic



Wyszukiwarka