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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
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:
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
Polecam http://helion.pl/ksiazki/sql-od-podstaw-paul-wilton-john-colby,sqlpod.htm .
Offline
A ja polecam phpmyadmina i myszkę.
Zazwyczaj działa. :D
Offline
[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
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
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
Zrób tak jak w innych przypadkach albo użyj tabeli łącznikowej. A najlepiej wywal tabele OpidGatunku, a kolumna opis do Gatunek.
Offline
Mam takie zasadnicze pytanie czy Ty wiesz coś o baza danych?
Offline
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)
Offline
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
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
[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
[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
Strony: 1
Time (s) | Query |
---|---|
0.00012 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00095 | 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='18.188.132.71' WHERE u.id=1 |
0.00083 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.188.132.71', 1732419674) |
0.00043 | SELECT * FROM punbb_online WHERE logged<1732419374 |
0.00053 | SELECT topic_id FROM punbb_posts WHERE id=219330 |
0.00005 | SELECT id FROM punbb_posts WHERE topic_id=22578 ORDER BY posted |
0.00055 | 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.00008 | SELECT search_for, replace_with FROM punbb_censoring |
0.00304 | 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.00093 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=22578 |
Total query time: 0.00755 s |