Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Początkujący - problem z utworzeniem bazy danych
Forum PHP.pl > Forum > Bazy danych > MySQL
Setesh
Witam.

Mam następujący problem - dopiero uczę się MySQL'a i nie wiem jak zaprojektować relacyjną bazę danych (z prostą radzę sobie).

przykładowo :

Chcę w bazie umieścić użytkowników z następującymi danymi w tabeli :

Tablica User:
- Login char 30
- Hasło char 30
- E-Mail char 50
- UserID int AutoIncrement
- Samochody

Tablica Samochody : (tutaj myślałem o relacjach marka -> model jeden do wielu)
-- Model char 30
= Marka char 30

I tu zaczyna się mój problem...

O ile każdy użytkownik ma jeden email, jedno hasło i jeden login to samochodów może mieć 1 lub więcej (np 2 lub 3 - albo i 0).

Każdy samochód ma swoją markę i model ale ma też swoje parametry które nie wiem jak i gdzie usadowić - parametry takie jak np silnik i jego pojemność oraz czy jest to wersja Coupe, sedan czy inna samochodu - czy ma szyberdach itd

Nie mam pojęcia jak to stworzyć - możecie mi w tym pomóc ? Byłbym wdzięczny za pomoc. Obsługa bazy będzie w PHP.
cojack
tabela marki
- idMarki
i inne

tabela modele
- idModelu
i inne

tabela Użytkownicy
- idUsera
- Login char 30
- Hasło char 30
- E-Mail char 50

tabela UzytkownicySamochody
- idUsera
- idMarki
- idModelu
primary key( idUsera, idMarki, idModelu )

taki rodzaj relacji, nazywa się wiele do wielu (z ang. many-to-many) możesz o nim poczytać na internecie.
Setesh
Cytat(cojack @ 31.08.2010, 17:36:10 ) *
tabela marki
- idMarki
i inne

tabela modele
- idModelu
i inne

tabela Użytkownicy
- idUsera
- Login char 30
- Hasło char 30
- E-Mail char 50

tabela UzytkownicySamochody
- idUsera
- idMarki
- idModelu
primary key( idUsera, idMarki, idModelu )

taki rodzaj relacji, nazywa się wiele do wielu (z ang. many-to-many) możesz o nim poczytać na internecie.



Wymyśliłem coś takiego :

Zapytanie 1 : Tabela User
  1. $zapytanie = "CREATE TABLE User ( ".
  2. "IDUsed int(11) DEFAULT '0' NOT NULL auto_increment, ".
  3. "login char(30), ".
  4. "password char (50), ".
  5. "email char(50), ".
  6. "PRIMARY KEY (IDUser) ".
  7. ")";


Zapytanie 2 : Tabela Marka
  1. $zapytanie = "CREATE TABLE Marka ( ".
  2. "IDMarka int(11) DEFAULT '0' NOT NULL auto_increment, ".
  3. "nazwa char(50), ".
  4. "PRIMARY KEY (IDMarka) ".
  5. ")";


Zapytanie 3 : Tabela Model
  1. $zapytanie = "CREATE TABLE Model ( ".
  2. "IDModel int(11) DEFAULT '0' NOT NULL auto_increment, ".
  3. "nazwa char(50), ".
  4. "PRIMARY KEY (IDModel) ".
  5. ")";


Zapytanie 4 : Tabela UserCar
  1. $zapytanie = "CREATE TABLE UserCar ( ".
  2. "IDUser int(11) DEFAULT '0' NOT NULL auto_increment, ".
  3. "IDMarka int(11) DEFAULT '0' NOT NULL auto_increment, ".
  4. "IDModel int(11) DEFAULT '0' NOT NULL auto_increment, ".
  5. "PRIMARY KEY (IDUser, IDMarka, IDModel) ".
  6. ")";


A gdzie mam dodać takie dane jak np czy samochód spala benzynę ? W tabeli Model ?

Bo jeżeli tak to mogę zrobić coś takiego że będzie dodatkowa tabela np :

Tabela Paliwo :
- ID_paliwo
- Typ

a tabelę model rozszerzyć o ID_paliwo i dodać relację ? Chcę mieć listę rozwijaną przy wpisywaniu danych do tabeli.

Wtedy Tabela Model wyglądała by tak :

Zapytanie 3 : Tabela Model
  1. $zapytanie = "CREATE TABLE Model ( ".
  2. "IDModel int(11) DEFAULT '0' NOT NULL auto_increment, ".
  3. "nazwa char(50), ".
  4. "ID_paliwo int(1), ".
  5. "PRIMARY KEY (IDModel) ".
  6. ")";


Tak dobrze ?
cojack
Nie ma nie wiadomo ile paliw, możesz to zrobić na typie wyliczeniowym ENUM. I zamiast ID_paliwo w Model, zrobić typPaliwa. Ale tak też jest dobrze. Nie zapominaj też że modele można podzielić na jeszcze parę grup, np na typy silników, lata produkcji, typy nadwozia itd... Więc albo będziesz dodawał różnego rodzaju modele tej samej marki w tabeli Model, albo to jeszcze bardziej rozbijesz. Tutaj rób jak uważasz, w zależności jak to będziesz wykorzystywał.


@edit
acha w tabeli Model brakuje kolumny idMarki.
Setesh
Zapytanie 3 : Tabela Model
  1. $zapytanie = "CREATE TABLE Model ( ".
  2. "IDModel int(11) DEFAULT '0' NOT NULL auto_increment, ".
  3. "nazwa char(50), ".
  4. "IDMarka int(11) DEFAULT '0' NOT NULL auto_increment, ".
  5. "PRIMARY KEY (IDModel,IDMarka) ".
  6. ")";


Dobrze ?

// Nieaktualne : Mam problem z zapytaniem - coś błąd mi wywala a chciałem dodać aby pola musiały być wypełnione...
  1. /*
  2.  $zapytanie = "CREATE TABLE User ( ".
  3.  "IDUser int(11) DEFAULT '0' NOT NULL auto_increment, ".
  4.  "login char(30) NOT NULL, ".
  5.  "password char(50) NOT NULL, ".
  6.  "email char(50) NOT NULL, ".
  7.  "PRIMARY KEY (IDUser) ".
  8.  ")";*/
  9. echo ZROBIONE !!!


A takie jeszcze pytanie aby nowego tematu nie tworzyć... W profesjonalnych zastosowaniach jak rozumiem rozdziela się użytkowników (jako bazę) od tego co w serwisie (np samochody) tak? Bo tak się zastanawiam... jak by się okazało że dużo użytkowników wchodzi na serwis to ja jest jedna baza z użytkownikami i samochodami to może szybko się okazać że będzie do bazy z dużo zapytań tak ? Tak się zastanawiam ile baz można na serwerach darmowych tworzyć dla jednego danego konta... bo jak więcej niż jedno to chyba lepiej rozdzielić bazę tak ?
cojack
Nie rozdzielaj baz na użytkowników. Nie masz takiej potrzeby. I masz błąd. idMarka ta kolumna powinna być kluczem obcym wskazującym na klucz główny w tabeli marki. A tworzenie tabel trzaskaj w mysqlphpadmin czy z konsoli, nie baw się w php z tym.
Setesh
Myślałem o tym aby robić to w phpmyadmin ale jak skończę robić sobie serwis (o ile można tak to nazwać) to chce automatycznie stworzyć tabele za pomocą jednego skryptu zamiast bawić się z tym ręcznie. ogólnie baza będzie bardzo rozbudowana - dużo tabel i relacji między nimi bo tematykę rozbiję na jak najmniejsze potrzebne mi elementy - problem z tym że nie umiałem robić relacji między tabelami (teraz mniej więcej - chyba mniej smile.gif ).

A jak zaznaczyć że idMarka ma być kluczem obcym ? bez default ?
cojack
Zobacz na przykładach: http://dev.mysql.com/doc/refman/5.1/en/inn...onstraints.html
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.