Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> relacje miedzy tabelami, klucze
zietek
post
Post #1





Grupa: Zarejestrowani
Postów: 34
Pomógł: 1
Dołączył: 25.12.2007

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


Witam!


Tabela 1. Producenci

Kod
ID MARKA

1 Sony
2 Samsusng
3 Lg



Tabela 2. Towary

Kod
ID ID_PRODUCENTA NAZWA

1             2 monitor
2             2 telewizor
3             3 dvd-rom



Do tej pory dane wybieralem przy pomocy LEFT JOIN:

  1. SELECT Towary.ID
  2. Towary.ID_PRODUCENTA
  3. Towary.NAZWA
  4. Producenci.MARKA
  5. LEFT JOIN Producenci ON Producenci.ID = Towary.ID_PRODUCENTA
  6. FROM Towary


Stosujac ujemne wartosci w polu ID_PRODUCENTA (nie majace odpowiednikow w tabeli Producenci) okreslam np:
ID_PRODUCENTA = -1 gdy nieznany producent z terenu Europy
ID_PRODUCENTA = -2 gdy nieznany producent z terenu Azji
itd...

W takich przypadkach otrzymuje w wynikowym zapytaniu pole MARKA wypelnione wartoscia NULL a ujemna wartosc pola ID_PRODUCENTA wskazuje jaki

komunikat ma zostac wyswietlony przy danym produkcie z powodu braku producenta.

Minusem tej 'calej zabawy' jest koniecznosc sprawdzania przy usuwaniu rekordow z tabeli Producenci, czy nie ma jakis rekordow w tabeli Towary

podpietych pod usuwanego producenta.


Zdaje sobie sprawe, ze mozna to wykonac w sposob bardziej profesjonalny przy wykorzystaniu kluczy i relacji laczacych obie tabele.

Moze mi ktos podsunac pomysl?
Czy jest mozliwosc utowrzenia takiej relacji, ktora nie wymusza posiadania prawidlowego klucza przez tabele podrzedna (chodzi o ujemne

ID_PRODUCENTA)? Jezeli nie, to w jaki sposob rozwiazac ten problem?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
nevt
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


przecież nic nie stoi na przeszkodzie, żebyś w tabeli Producenci miał dwa (puste) wpisy dla dla tych producentów z Azji i Europy - wtedy nie musisz kombinować z kluczami nie spełniającymi relacji...

co do kontroli towarów powiązanych z producentem, pole ID_PRODUCENTA w tabeli towary musisz zdefiniować jako klucz obcy z kaskadowym usuwaniem / aktualizacją, czyli stwórz tabele Towary następująco:

  1. CREATE TABLE `Towary` (
  2. `ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `ID_PRODUCENTA` int(10) UNSIGNED NOT NULL,
  4. `NAZWA` varchar(255) NOT NULL,
  5. PRIMARY KEY USING BTREE (`ID`),
  6. KEY `Producent_key` (`ID_PRODUCENTA`),
  7. CONSTRAINT `Producent_key` FOREIGN KEY (`ID_PRODUCENTA`) REFERENCES `Producenci` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
  8. );


Ten post edytował nevt 2.03.2008, 13:45:06


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
zietek
post
Post #3





Grupa: Zarejestrowani
Postów: 34
Pomógł: 1
Dołączył: 25.12.2007

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


Ogolnie myslalem nad takim sposobem, jednak z gory nie wiem ile bedzie tych 'nietypowych kluczy'.
No i pole autoincrement ogranicza mnie z recznym wpisaniem tych danych np z ujemnymi warotsciami... musialy by one byc z kolejnego przydzialu.

Drugi problem jest taki, ze rekordy z takimi kluczami nie powinny byc widoczne w slowniku producentow.....tzn nie powinny byc traktowane jako pola edytowalne przez usera.

Cytat
przecież nic nie stoi na przeszkodzie, żebyś w tabeli Producenci miał dwa (puste) wpisy dla dla tych producentów z Azji i Europy - wtedy nie musisz kombinować z kluczami nie spełniającymi relacji...

A jest jakis sposob na wpisywanie kluczy obcych nie majacych swojego klucza podstawowego ?
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 Aktualny czas: 19.08.2025 - 16:30