Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Relacje w bazie - Biblioteka
Delleg
post
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 22.01.2013

Ostrzeżenie: (0%)
-----


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.
(IMG:http://i67.tinypic.com/105r8jq.png)

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.

Ten post edytował Delleg 17.01.2017, 01:09:09
Go to the top of the page
+Quote Post
pmir13
post
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
javafxdev
post
Post #3





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 27.10.2015

Ostrzeżenie: (0%)
-----


W tabeli wypożyczenia - czy data, godzina, dataZwrotu nie powinny być innego typu niż VARCHAR?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
pmir13
post
Post #5





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 15:08