Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2012-12-28 00:31:15

  Kamil2685 - Użytkownik

Kamil2685
Użytkownik
Zarejestrowany: 2011-04-06

Problem z relacyjna baza danych w MySQL

Witam,
chcę stworzyć sobię bazę danych ktorej poglad zamieszczam nizej:
[img]http://i.img-share.net/R8tynQDTNi.jpg[/img]
lub link [url]http://c.wrzuta.pl/wi17544/6be46a56001325f850dcd813/baza[/url] badz [url]http://i.img-share.net/R8tynQDTNi.jpg[/url] .
Utworzyłem sobie takie oto tabele:

Kod:

CREATE TABLE Opis_gatunku (
IdGatunku TINYINT NOT NULL AUTO_INCREMENT,
Opis TEXT,
PRIMARY KEY (IdGatunku) );

CREATE TABLE Gatunek (
IdGatunku TINYINT NOT NULL AUTO_INCREMENT,
TypGry VARCHAR(20),
PRIMARY KEY (IdGatunku) );

CREATE TABLE Gra (
IdGry TINYINT NOT NULL AUTO_INCREMENT,
Tytul VARCHAR(20),
RokWydania YEAR,
Cena SMALLINT,
Opis TEXT,
...???... ,
PRIMARY KEY (IdGry) );

CREATE TABLE Wydawca (
IdWydawca TINYINT NOT NULL AUTO_INCREMENT,
Wydawca VARCHAR(30),
DataZalozenia YEAR,
Kraj VARCHAR(15),
Email VARCHAR(30),
PRIMARY KEY (IdWydawca) );

CREATE TABLE Ocena (
IdOcena TINYINT NOT NULL AUTO_INCREMENT,
Ocena INT,
PRIMARY KEY (IdOcena) );

CREATE TABLE Nosnik (
IdNosnik TINYINT NOT NULL AUTO_INCREMENT,
Nosnik VARCHAR (20), 
PRIMARY KEY (IdNosnik) );

I teraz kilka pytań:
1. W tabeli Gra w jaki sposób utworzyć pola Wydawca, Ocena, Nosnik ?
2. W jaki sposob pozniej mam narzucić na to wszystko relacje aby jakoś fajnie funkcjonowało?
3. Czy da się zrobić tą bazę w taki sposób aby skasowanie wpisu w tabeli np. Gra powodowało usnięcie go też z tabeli Gatunek ?
4. Czy posiada ktoś jakiś dobry przykład podobnej bazy lub jakąś literaturę która łopatologicznie wytłumaczy mi jak mam się za to wszystko zabrać i czy jest w stanie coś takiego udostępnić ?

Serdecznie pozdrawiam i z góry dziękuję za pomoc!

Offline

 

#2  2012-12-29 01:26:06

  kamikaze - Administrator

kamikaze
Administrator
Zarejestrowany: 2004-04-16

Re: Problem z relacyjna baza danych w MySQL

Polecam http://helion.pl/ksiazki/sql-od-podstaw-paul-wilton-john-colby,sqlpod.htm .

Offline

 

#3  2012-12-29 01:56:21

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: Problem z relacyjna baza danych w MySQL

A ja polecam phpmyadmina i myszkę.
Zazwyczaj działa. :D


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#4  2012-12-29 14:53:00

  Kamil2685 - Użytkownik

Kamil2685
Użytkownik
Zarejestrowany: 2011-04-06

Re: Problem z relacyjna baza danych w MySQL

[quote=Jacekalex]A ja polecam phpmyadmina i myszkę.
Zazwyczaj działa. :D[/quote]
Rada dobra ale ostateczność jak dla mnie. Wyklikać coś nie sztuka ale spróbować zrobić to samo w czarnym okienku z białymi literkami już może spowodować małe objawy satysfakcji, a tak poza tym jak się zrobi coś w konsoli to napewno się to potem wyklika bo załapie człowiek jak to działa.

Co do ksiażki dziękuje za podpowiedź

Offline

 

#5  2012-12-29 16:27:27

  qluk - Pan inż. Cyc

qluk
Pan inż. Cyc
Skąd: Katowice
Zarejestrowany: 2006-05-22

Re: Problem z relacyjna baza danych w MySQL

AD. 2. w fazie budowy, a nie "poźniej"
AD. 3. Tak.
AD.4. Użyj MySQL workbench, zaprojektuj bazę i wygeneruj kod a potem przeanalizuj, zadziała najszybciej.
AD.4.1. W każdej tabeli primery key najlepiej zeby miał swoja własną nazwę a nie w 2 tabelach taka sama.
AD.4.2. W głównej tabeli np zamiast wydawca powinno byc pole bedące kluczem obcym (idWydawcy).

Przy okazji:
http://pl.wikipedia.org/wiki/Posta%C4%87_normalna_(bazy_danych)

Nie wiem co chcesz trzymac w tabli ocen, ale jesli np wartości od 1 do 5 to sam klucz wyszukania bedzie zajmował wiecej przestrzeni niż "nadmiarowść" danych w tabli głównej.

Offline

 

#6  2013-01-03 00:32:11

  Kamil2685 - Użytkownik

Kamil2685
Użytkownik
Zarejestrowany: 2011-04-06

Re: Problem z relacyjna baza danych w MySQL

Witam
stworzyłem coś takiego:
[img]http://c.wrzuta.pl/wi6531/1db4c162001c604850e4c131/baza1[/img]

Jednak dalej mam problem z nałożeniem odpowiednich relacji szczególnie na gatunek i opis gatunku.
W tabeli opis gatunku planuje aby zawierały się:
-id opisu gatunku np.1
-opis gatunku np gry strategiczne to gry...
natomiast w tabeli Gatunek:
-id gatunek np. 1
-typ gry np. strategiczne.
Niewiem mimo wszystko jak to połączyć aby było spójne i miało ręce i nogi, więc bardzo proszę o pomoc.
PS.
Co do nadmiarowości danych, zdaję sobie sprawę z tego że jest to rzecz ważna w momencie gdy tworzy się poważniejszą bazę, ta jest jednak dla mnie pierwszą na podstawie której chciałem się nauczyć ich tworzenia.

Offline

 

#7  2013-01-03 19:14:23

  kamikaze - Administrator

kamikaze
Administrator
Zarejestrowany: 2004-04-16

Re: Problem z relacyjna baza danych w MySQL

Zrób tak jak w innych przypadkach albo użyj tabeli łącznikowej. A najlepiej wywal tabele OpidGatunku, a kolumna opis do Gatunek.

Offline

 

#8  2013-01-03 23:14:55

  qluk - Pan inż. Cyc

qluk
Pan inż. Cyc
Skąd: Katowice
Zarejestrowany: 2006-05-22

Re: Problem z relacyjna baza danych w MySQL

Mam takie zasadnicze pytanie czy Ty wiesz coś o baza danych?

Offline

 

#9  2013-01-04 14:51:36

  jezoo - Dzięcioł

jezoo
Dzięcioł
Skąd: Z lasu
Zarejestrowany: 2005-09-02

Re: Problem z relacyjna baza danych w MySQL

masz problem bo masz same relacje 1:1 a nie  1 do wielu.
np. 1 gra może mieć kilku wydawców lub gatunków, może mieć różne nośniki (CD/DVD, Blue-Ray).

Na początek to zrób porządnie logikę biznesową a później zrób bazę.

Ostatnio edytowany przez jezoo (2013-01-04 14:52:22)


[img]http://intershock.pl/images/icons/freebsd.jpg[/img] [img]http://www.the-eleven.com/site_media/static/img/postgresql_powered.png[/img] [img]http://www.wwgmc.com/images/badge_php.gif[/img]
LRU #480459

Offline

 

#10  2013-01-06 00:32:12

  Kamil2685 - Użytkownik

Kamil2685
Użytkownik
Zarejestrowany: 2011-04-06

Re: Problem z relacyjna baza danych w MySQL

Kiedyś coś w acces`ie ale bez żadnej głębszej teorii - więc moja wiedza jest mniej niż skromna.

Zgadzam się relacje powinny wyglądać tak:
Tab Wydawca ------- Tab Gra
1-n: Ponieważ tak jak napisałeś istnieje możliwość że jedna gra jest wydawana przez kilka firm;
Tab Gra ----Tab Rozmiar (dawniej Tab Nośnik miałem rozmiar na myśli i to wprowadza w błąd)
1-1 : Ponieważ każda gra ma jakis rozmiar np. do 300 Mb.
Tab Gra --- Tab Gatunek
1-1 Ponieważ każda gra należy do jednego gatunku gier.
Tab Gra ---- Tab Ocena
1-1 Ponieważ każda gra posiada jedną ocenę.

Poprawione wygląda tak:
[img]http://c.wrzuta.pl/wi689/c93b99200003c68a50e8b665/clipboard02[/img]
Mam tylko wątpliwości czy w relacji między tabelą Gra a tabelą Wydawca relacja jest dobrze stworzona ponieważ wydaje mi się że klucz obcy powinien znajdować się w tabeli Wydawca i zawierać IdGry. Czy, tak ?

Offline

 

#11  2013-01-06 09:26:19

  djjanek - Użytkownik

djjanek
Użytkownik
Skąd: whereis
Zarejestrowany: 2007-11-15
Serwis

Re: Problem z relacyjna baza danych w MySQL

Poczytaj sobie o relacyjnych bazach danych bo aż w oczy kole.

Gra ma jeden rozmiar, ale rozmiar może mieć wiele gier wiec 1-wielu
Bo jak 2 gry maja akurat 300Mb to tylko jedną będziesz mógł przypisać a drugą już nie.

i tak dalej i tak dalej, z podstaw pamiętam unikaj relacji 1-1 i wiele-wielu a to wynika z optymalizacji.

Offline

 

#12  2013-01-06 16:05:50

  sal_i - Członek DUG

sal_i
Członek DUG
Skąd: Neverhood
Zarejestrowany: 2007-01-01

Re: Problem z relacyjna baza danych w MySQL

[quote=Kamil2685]Tab Wydawca ------- Tab Gra
1-n: Ponieważ tak jak napisałeś istnieje możliwość że jedna gra jest wydawana przez kilka firm;[/quote]
Sytuacja możliwa, ale raczej żadko spotykana, wiesz prawa autorskie i takie tam.
Nie wiem co twój model danych ma ilustrować ale ja bym wyszedł od zależności odwrotnej, gra ma jednego i tylko jednego wydawcę, ale wydawca wydaje wiele gier - dlatego 1:n

Tab Gra ----Tab Rozmiar (dawniej Tab Nośnik miałem rozmiar na myśli i to wprowadza w błąd)
1-1 : Ponieważ każda gra ma jakis rozmiar np. do 300 Mb.[/quote]
Jeśli koniecznie chcesz taką tabelę to zależność powinna być raczej n:1 bo każda gra ma jeden rozmiar, ale ten sam rozmiar może mieć wiele gier. (To jest idiotyczny wymiar, pole powinno być w tabeli faktowej, u ciebie w tabeli Gra)

Tab Gra --- Tab Gatunek
1-1 Ponieważ każda gra należy do jednego gatunku gier.[/quote]
Nie, n:1 bo każda gra należy do tylko jednego gatunku, ale każdy gatunek może mieć wiele gier.

Tab Gra ---- Tab Ocena
1-1 Ponieważ każda gra posiada jedną ocenę.[/quote]
Nie, n:1 Każda gra ma przypisaną tylko jedną ocenę, ale każda ocena może być przypisana do wielu gier.

Mam tylko wątpliwości czy w relacji między tabelą Gra a tabelą Wydawca relacja jest dobrze stworzona ponieważ wydaje mi się że klucz obcy powinien znajdować się w tabeli Wydawca i zawierać IdGry. Czy, tak ?[/quote]
tworzysz coś w rodzaju "star schema" w takim przypadku twoją tabelą faktową jest tabela Gra, a w takiej konstrukcji kluczem głównym tabeli Gra jest klucz złożony ze wszystkich kluczy obcych. To znaczy że dobrze jest jak jest. A pole idGra jest zbędne, bo w tym modelu nie służy niczemu.


“Generowanie liczb losowych jest zbyt ważne, żeby zostawiać to przypadkowi”

Offline

 

#13  2013-01-06 16:12:00

  djjanek - Użytkownik

djjanek
Użytkownik
Skąd: whereis
Zarejestrowany: 2007-11-15
Serwis

Re: Problem z relacyjna baza danych w MySQL

przecyztaj z wielkim zrozumieniem:   [url=http://pl.wikipedia.org/wiki/Posta%C4%87_normalna_(bazy_danych)]Postać Normalna[/url]

Ostatnio edytowany przez djjanek (2013-01-06 16:12:49)

Offline

 

#14  2013-01-06 17:26:39

  qluk - Pan inż. Cyc

qluk
Pan inż. Cyc
Skąd: Katowice
Zarejestrowany: 2006-05-22

Re: Problem z relacyjna baza danych w MySQL

[quote=djjanek]przecyztaj z wielkim zrozumieniem:   [url=http://pl.wikipedia.org/wiki/Posta%C4%87_normalna_(bazy_danych)]Postać Normalna[/url][/quote]
Ej, pierwszy to zamieszczałem :]

Dobra, lecimy:
1)  cena -> DECIMAL(3,2)
2)  rok wydania jako osobna tablica, gdzie idRok TINYINT  - zaoszczedzi sie miejsce w przypadku dużej ilości danych, inaczej pomijalny zysk, chyba ze serwer to 386 :)
3) Ocena powinna być w głównej tablicy, teraz masz 3 * TINYINT, a będziesz miał 1 * TINYINT - brak zysku (TINYIMNT to jeden bajt)
4)  identyfikatory w tablicach jako tinyint to czasem moze byc za mało bo masz tylko 128 unikatowych wartości jako ID.
5)  jeśli zastosujesz tablice na rok, to wtedy z tablicy wydawca zniknie YEAR na rzecz tinyint - znów zysk na rozmiarze.
6)  gdzies tablice z nośnikiem zjadło ale to nieistotne lepiej się jej pozbyć.

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)

[ Generated in 0.007 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00011 SET CHARSET latin2
0.00003 SET NAMES latin2
0.00055 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='52.14.27.122' WHERE u.id=1
0.00112 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '52.14.27.122', 1732419487)
0.00028 SELECT * FROM punbb_online WHERE logged<1732419187
0.00035 SELECT topic_id FROM punbb_posts WHERE id=219667
0.00024 SELECT id FROM punbb_posts WHERE topic_id=22578 ORDER BY posted
0.00028 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=22578 AND t.moved_to IS NULL
0.00025 SELECT search_for, replace_with FROM punbb_censoring
0.00077 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=22578 ORDER BY p.id LIMIT 0,25
0.00082 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=22578
Total query time: 0.0048 s