Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Początkujący - problem z utworzeniem bazy danych, Zaprojektowanie relacyjnej bazy w MySQL
Setesh
post 31.08.2010, 15:58:51
Post #1





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 2.10.2006
Skąd: Wrocław

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


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.


--------------------
Znudził Ci się wygląd twojej v39'ki ? Zmień to! :)

| Google | CodeGear | Swiss Delphi Center (ENG) | digitalmars.com | 4programmers.net | dsdt.info | BinBoy | delphi.cartall.com.pl | CPW.net.pl | cyfbar.republika.pl|
Go to the top of the page
+Quote Post
cojack
post 31.08.2010, 16:36:10
Post #2





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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.

Ten post edytował cojack 31.08.2010, 16:36:58


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
Setesh
post 31.08.2010, 17:46:29
Post #3





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 2.10.2006
Skąd: Wrocław

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


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 ?


--------------------
Znudził Ci się wygląd twojej v39'ki ? Zmień to! :)

| Google | CodeGear | Swiss Delphi Center (ENG) | digitalmars.com | 4programmers.net | dsdt.info | BinBoy | delphi.cartall.com.pl | CPW.net.pl | cyfbar.republika.pl|
Go to the top of the page
+Quote Post
cojack
post 31.08.2010, 17:51:27
Post #4





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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.

Ten post edytował cojack 31.08.2010, 17:53:16


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
Setesh
post 31.08.2010, 18:01:38
Post #5





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 2.10.2006
Skąd: Wrocław

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


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 ?

Ten post edytował Setesh 31.08.2010, 18:22:47


--------------------
Znudził Ci się wygląd twojej v39'ki ? Zmień to! :)

| Google | CodeGear | Swiss Delphi Center (ENG) | digitalmars.com | 4programmers.net | dsdt.info | BinBoy | delphi.cartall.com.pl | CPW.net.pl | cyfbar.republika.pl|
Go to the top of the page
+Quote Post
cojack
post 31.08.2010, 18:28:43
Post #6





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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.


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
Setesh
post 31.08.2010, 19:07:31
Post #7





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 2.10.2006
Skąd: Wrocław

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


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 ?


--------------------
Znudził Ci się wygląd twojej v39'ki ? Zmień to! :)

| Google | CodeGear | Swiss Delphi Center (ENG) | digitalmars.com | 4programmers.net | dsdt.info | BinBoy | delphi.cartall.com.pl | CPW.net.pl | cyfbar.republika.pl|
Go to the top of the page
+Quote Post
cojack
post 1.09.2010, 08:23:03
Post #8





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Zobacz na przykładach: http://dev.mysql.com/doc/refman/5.1/en/inn...onstraints.html


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 19:55