Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Relacje w bazie - Biblioteka
Forum PHP.pl > Forum > Bazy danych > MySQL
Delleg
Jako początkujący w dziedzinie baz danych próbuje okiełznać MySQL Workbench. Mam za zadanie stworzyć bazę danych taką jak na rysunku, który dodatkowo umieściłem go koło mojego diagramu tejże bazy danych.


Dodatkowo lista "wyzwań" jeśli chodzi o kwerendy.
  1. Wypożyczone książki, Dostępne książki, Wszystkie książki
  2. Książki posortowane wg ilości wypożyczeń
  3. Czytelnicy (Wypożyczający) posortowani wg ilości wypożyczeni
    (funkcja przydatna do konkursów czytelniczych dla dzieci i młodzieży).
  4. Pracownicy posortowani wg ilości wypożyczonych przez nich książek.
  5. Gatunki literackie posortowane wg ilości wypożyczonych książek do nich należących
  6. Wydawnictwa posortowane wg ilości wypożyczonych książek przez nie wydanych
  7. Autorzy posortowani wg ilości wypożyczonych książek przez nich napisanych


Niemniej jednak nie wiem czy poprawnie wykonałem te zadanie, dlatego proszę o Waszą konsultację. Największe problemy sprawia mi zrozumienie jakiego rodzaju zapytania mam użyć aby zamiast kluczy obcych pobrać z bazy korespondującą wartość.
Efektem końcowym ma być tabela będąca połączeniem wszystkich tabel, jak to zrobić, zakładając oczywiście że poprawnie wykonałem relacje między nimi.
pmir13
1. Masz niepotrzebne dodatkowe pola jako klucze obce. Z rysunku wynika, że na przykład w tabeli Ksiazka IDA powinno być kluczem obcym powiązanym z kluczem głównym IDA z tabeli Autor. Zamiast tego masz IDA w tabeli Ksiazka jako zwykłe pole (nie wiadomo do czego) oraz jeszcze Autor_IDA jako klucz obcy. Podobnie z innymi kluczami obcymi. Wprawdzie rysunek nie określa precyzyjnie jak te klucze obce mają być nazwane, bo są tam puste miejsca, ale zdrowy rozsądek podpowiada że powinny być nazwane tak samo jak odpowiadające im klucze główne z innych tabel. Ponadto w tabeli Wypozyczenia brakuje klucza obcego do tabeli Ksiazka, IDK powinien być czerwony.

2. O ile nie przewidujemy wartości NULL dla danego pola to powinny być zdefiniowane jako NOT NULL (wypełniona ikonka). Jedyne pole w całej bazie które powinno mieć możliwość wstawiania NULL to DataZwrotu, bo rozumiem że książka jest wypożyczona gdy istnieje dla niej wpis w tabeli Wypozyczenia i DataZwrotu jest NULL, a w momencie zwrotu pole DataZwrotu jest uzupełniane bieżącą datą.

3. Widząc pole Sygnatura INT(255) można się tylko uśmiechnąć. INT z pewnością nie udźwignie liczby z 255 cyframi. http://dev.mysql.com/doc/refman/5.7/en/num...attributes.html

4. Do pobierania wartości o które pytasz służą złączenia.
Przykładowo by pobrać nazwy książek wraz z ich autorami użylibyśmy (już po poprawieniu kluczy o których mowa wyżej, czyli IDA w tabeli Ksiazka jest kluczem obcym do IDA w tabeli Autor ):
  1. SELECT Ksiazka.Tytul, Autor.Imie, Autor.Nazwisko
  2. FROM Ksiazka JOIN Autor
  3. ON Ksiazka.IDA = Autor.IDA


Do zliczania w obrębie jednej tabeli używamy przykładowo dla pracowników:
  1. SELECT Wypozyczenia.IDP, count(*) AS Ile_wypozyczen
  2. FROM Wypozyczenia
  3. GROUP BY Wypozyczenia.IDP
  4. ORDER BY Ile_wypozyczen DESC

Oczywiście jeśli dany pracownik nic nie wypożyczył to wpisu z jego IDP w tabeli Wypozyczenia nie będzie, musimy o tym pomyśleć łącząc to z tabelą Pracownik, bo w wyzwaniu nr 4 zapewne chodzi o listę wszystkich pracowników i dla tych, którzy nic nie wypożyczyli będziemy musieli wstawić 0.
Tak będzie wyglądać pełne rozwiązanie pkt 4:
  1. SELECT p.Imie, p.Nazwisko, COALESCE( sumy.Ile_wypozyczen, 0 ) AS Wypozyczone_ksiazki
  2. FROM
  3. Pracownik p
  4. LEFT JOIN
  5. ( SELECT w.IDP, count(*) AS Ile_wypozyczen
  6. FROM Wypozyczenia w
  7. GROUP BY w.IDP ) sumy
  8. ON p.IDP=sumy.IDP
  9. ORDER BY Wypozyczone_ksiazki DESC, p.Nazwisko ASC

Jeśli przeanalizujesz i zrozumiesz to zapytanie (nie "te zapytanie", podobnie jak "to zadanie", nie "te zadanie"), to reszta nie powinna sprawiać trudności.
javafxdev
W tabeli wypożyczenia - czy data, godzina, dataZwrotu nie powinny być innego typu niż VARCHAR?
Pyton_000
Czepiając się już:
Cytat
3. Widząc pole Sygnatura INT(255) można się tylko uśmiechnąć. INT z pewnością nie udźwignie liczby z 255 cyframi. http://dev.mysql.com/doc/refman/5.7/en/num...attributes.html

Owszem można się uśmiechnąć bo komentujesz coś o czym nie masz pojęcia. Liczba podana w nawiasie mówi o dopełnieniu 0 ( atrybut ZERO FILL). I owszem zadziała tak jak ma zadziałać.
Tak więc wink.gif
pmir13
Cytat(Pyton_000 @ 23.01.2017, 21:49:43 ) *
Czepiając się już:

Owszem można się uśmiechnąć bo komentujesz coś o czym nie masz pojęcia. Liczba podana w nawiasie mówi o dopełnieniu 0 ( atrybut ZERO FILL). I owszem zadziała tak jak ma zadziałać.
Tak więc wink.gif

Przecież nawet cytujesz podlinkowany manual, w którym czarno na białym jest że liczba w nawiasie dla typów numerycznych całkowitych to ilość cyfr, a ZEROFILL dopiero po dodaniu tego słowa jawnie jako dodatkowego atrybutu dopełnia zerami. I nawet gdyby był u autora wątku ten ZEROFILL to niby tak miało być? Serio? Sygnatura z ponad 200 zerami na początku i tylko 11 ostatnich coś może znaczyć, bo INT i tak więcej nie zmieści? I może jeszcze to samo dla CenaZakupu? Chcesz się doczepić, ok, ale akurat tutaj nie wyszło. Może coś konstruktywnego autorowi napisz?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.