Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Klucze obce oraz podstawowe
Forum PHP.pl > Forum > Przedszkole
agentmullder
Witam. Trochę się naczytałem o tych wszystkich relacjach jeden do jednego, jeden do wielu i wiele do wielu. Ale nasunela mi się wątpliwość. Otóż, mam 3 tabele:

-klienci
-czesci

-zamowienia

W tabeli zamowienia tworze liste zamowien kazdego klienta pobierajac dane z tych dwoch tabel wyzej. Czyli, aby zrobic relacje jeden do wielu, co musialbym zrobic? Ustawic klucze podstawowe w w tabelach klienci i czesci oraz ustawic kolumny z kluczem obcym w tabeli zamowienia, w ktorych sa wykorzystane dane z tabeli klienci i czesci?

Oraz drugie pytanie, jesli zle ustawie klucze obce, bedzie to mialo wplyw na poprawnosc dzialania bazy czy tylko na jej efektywnosc?
lDoran
Ja to widzę tak:
Kod
Tabela klienci:

klient_id(klucz własny) | name

Tabela części:
czesc_id(klucz własny) | name

Tabela zamówienia:
zamówienie_id(klucz własny) | klient_id(klucz obcy) | czesc_id(klucz obcy)

Alternatywne rozwiązanie, możesz wszystkim obarczyć kod PHP poprzez wykonywanie odpowiednich zapytań.
piotrooo89
Relacje to co innego a klucze to co innego. Kluczę pozwalają Ci wymusić spójność w bazie danych a relacje przedstawiają sposób i zawartość reprezentowanych danych. Najlepiej ustawić PK w tabelach klienci i części a później zrobić FK w tabeli zamówienia "wskazujący" na te klucze w tych tabelach.

Oczywiście, każda (mniejsza lub większa) nieprawidłowość w jakiś sposób wpływa na poprawność i przede wszystkim szybkość działania danej bazy.
agentmullder
Cytat(piotrooo89 @ 6.09.2010, 11:58:59 ) *
Relacje to co innego a klucze to co innego. Kluczę pozwalają Ci wymusić spójność w bazie danych a relacje przedstawiają sposób i zawartość reprezentowanych danych. Najlepiej ustawić PK w tabelach klienci i części a później zrobić FK w tabeli zamówienia "wskazujący" na te klucze w tych tabelach.

Oczywiście, każda (mniejsza lub większa) nieprawidłowość w jakiś sposób wpływa na poprawność i przede wszystkim szybkość działania danej bazy.


Ok wiec jakbym chcial nalozyc ten klucz obcy w tabeli wypozyczenia, to czy by to wygladalo w ten sposob dla tabel:

[klienci]
-klient_id
-imie
-nazwisko

[czesci]
-czesci_id
-cena
-sztuk

[wypozyczenia]
-wypozyczenie_id
-wypozyczenie_klient
-wypozyczenie_czesci
-data

  1. FOREIGN KEY (wypozyczenie_klient) REFERENCES klienci(klient_id) ON DELETE CASCADE ON UPDATE CASCADE;
  2. FOREIGN KEY (wypozyczenie_czesci) REFERENCES czesci(czesci_id) ON DELETE CASCADE ON UPDATE CASCADE;


Cos w ten desen? I czy ON DELETE CASCADE ON UPDATE CASCADE zostawic czy mozna tylko ON UPDATE CASCADE? Czy obie delete i update sa nierozlaczne?
nospor
na czesci nie powinno byc ondelete cascada a ondelete RESTRICT.
RAczej nie nalezy dopuszczac do sytuacji, gdy ktoś wypozyczy jakąś cześć to potem ona zniknie bo w bazie ktoś sobie ją usunal. Czesc ktora zostala wypozyczona nie ma prawa zniknać z bazy.

agentmullder
Cytat(nospor @ 6.09.2010, 12:14:38 ) *
na czesci nie powinno byc ondelete cascada a ondelete RESTRICT.
RAczej nie nalezy dopuszczac do sytuacji, gdy ktoś wypozyczy jakąś cześć to potem ona zniknie bo w bazie ktoś sobie ją usunal. Czesc ktora zostala wypozyczona nie ma prawa zniknać z bazy.


No to w takim razie, skoro z bazy nie moze zniknac jakas czesc, to takze i klient nie moze zniknac.

Wiec poprawmy:

  1. FOREIGN KEY (wypozyczenie_klient) REFERENCES klienci(klient_id) ON DELETE RESTRICT ON UPDATE CASCADE;
  2. FOREIGN KEY (wypozyczenie_czesci) REFERENCES czesci(czesci_id) ON DELETE RESTRICT ON UPDATE CASCADE;


A przy update moze zostac cascade? Czy tez RESTRICT?
nospor
Cytat
No to w takim razie, skoro z bazy nie moze zniknac jakas czesc, to takze i klient nie moze zniknac.
No tu już sprawa dyskusyjna i zależy od sytuacji, dlatego też nie czepiałem sie do tej akurat relacji smile.gif

Cytat
A przy update moze zostac cascade? Czy tez RESTRICT?
Zacznijmy od tego, że raczej ID rekordów nie zmieniają się, więc update można olac. Nie mniej jednak jesli już dajemy onupdate to lepiej zrobic restrict, by wymusisz te prawde, iż rekordom ID lepiej nie zmieniac winksmiley.jpg
agentmullder
Ok rozumiem. A co moze byc nie tak, bo wyrzuca mi blad jak robie takie polecenie w myAdminie:

  1. UPDATE wypozyczenia SET FOREIGN KEY (klient) REFERENCES uzytkownicy(uzytkownik_email) ON DELETE RESTRICT ON UPDATE RESTRICT;



Cytat
#1064 - Something is wrong in your syntax obok 'FOREIGN KEY (klient) REFERENCES uzytkownicy(uzytkownik_email) ON DELETE RESTRICT' w linii 1
nospor
klucze do tabel dodaje sie przy pomocy ALTER TABLE a nie UPDATE. Wiecej info w manualu
agentmullder
Ok. Super dziala smile.gif Dziekuje.
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.