Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kiedy potrzebna druga tabela?
Forum PHP.pl > Forum > Bazy danych > MySQL
Asmox
Zauważyłem, że często do różnych obiektów tworzy się dodatkowe tabele, a w głównej tylko ID pól w tamtych tabelach dla identyfikacji. Czasami mam wrażenie, że dla niektórych rzeczy to przesada i można po prostu wpisać normalną nazwę, bez odnośników do innych tabel. Chciałbym się dowiedzieć, kiedy takie działania są w granicach rozsądku i nie uciążliwe. W praktyce mam taką tabelę, z... powiedzmy odnośnikami do kursów online i tabelę z kategoriami kursów:
Kod
         +----+--------------+-----------+--------+------------------------------------------+------------+
         | ID | NAZWA        | KATEGORIA | LEKCJA | LINK                                     | OST_EDYCJA |
         +----+--------------+-----------+--------+------------------------------------------+------------+
         |  1 | Wprowadzenie | 0         | 1      | kursy-online/kurs-html/wprowadzenie.html | 2009-03-04 |
         |  2 | Znaczniki    | 0         | 2      | kursy-online/kurs-html/znaczniki.html    | 2009-03-04 |
         +----+--------------+-----------+--------+------------------------------------------+------------+

+----+-----------+
| ID | NAZWA     |
+----+-----------+
|  1 | Kurs HTML |
+----+-----------+

Zastanawiam się, czy nie byłoby lepiej, gdybym wykasował tę drugą tabelę, a w polu kategoria po prostu wpisywać normalne nazwy. Oszczędziłoby mi to robienia funkcji na wyciąganie nazwy kategorii z jego ID i przyspieszyło wyciąganie wszystkich rekordów z kategorią HTML. A jak wy myślicie?
phpion
Zapoznaj się z pojęciem normalizacji bazy danych (postacie normalne) i wówczas Twoje wątpliwości znikną.
Asmox
Poczytałem sobie w Wikipedii.... Ale za bardzo nic z tego nie rozumiem.... Piszą, że najlepiej jest rozbić dużą tabelę na kilka mniejszych, ale nie wiem czy w tym przypadku jest to dobre rozwiązanie. Może ktoś pomoc?
nospor
Cytat
Zastanawiam się, czy nie byłoby lepiej, gdybym wykasował tę drugą tabelę, a w polu kategoria po prostu wpisywać normalne nazwy. Oszczędziłoby mi to robienia funkcji na wyciąganie nazwy kategorii z jego ID i przyspieszyło wyciąganie wszystkich rekordów z kategorią HTML
Nie, nie i jeszcze raz nie smile.gif

Teraz masz zrobione tak jak ma byc.
vsemak
1. nie musisz tworzyc dodatkowej funkcji przez JOIN w zapytaniu sql pobierzesz kursy razem z kategoriami.
2. kiedy tworzysz kurs, musisz prawdopodobnie z listy select (html) wybrać odpowiednią kategorię, z którą chcesz go powiązać. Gdyby nie istniała tabela z kategoriami, musiałbyś pobrać z tabeli z kursami niepowtarzające się nazwy kategorii. Z pewnością trwało by to dłużej niż zwykły select.
3. Gdybyś w tabeli kursy dodał pole "nazwa kategorii" to w przypadku 100 kursów na jedną kategorię nazwa tej kategorii będzie powtórzona 100 razy, a napewno zdajesz sobie sprawe z tego ze varchar zajmuje duzzo wiecej miejsca od INT'a.
4. itd.
Asmox
Dobrze więc, niech tak będzie.
vsemak
Jako dodatkowa pomoc pokażę przykładowy select z JOIN.

SELECT k.*, kk.`nazwa` AS nazwa_kategorii FROM `kursy` k LEFT JOIN `kategorie_kursow` kk ON kk.`id_kategorii` = k.`id_kategorii`;
Asmox
Nie bardzo rozumiem Twój przykład, ale zainteresowałem się funkcją JOIN. Mam niestety problemy. Dla zapytania do MySQL:

  1. SELECT * FROM linki JOIN kategorie ON linki.KAT_ID=kategorie.KAT_ID;


Wynik jest taki:
Kod
+---------+--------+---------------+--------+------------+--------+-----------+
| LINK_ID | KAT_ID | LINK_NAZWA    | LEKCJA | OST_EDYCJA | KAT_ID | KAT_NAZWA |
+---------+--------+---------------+--------+------------+--------+-----------+
|       0 |      0 | Wprowadzenie  | 1      | 2009-03-04 |      0 | HTML      |
|       1 |      0 | Znaczniki     | 2      | 2009-03-04 |      0 | HTML      |
|       2 |      1 | Znaczniki PHP | 1      | 2009-03-06 |      1 | PHP       |
+---------+--------+---------------+--------+------------+--------+-----------+


Chciałbym się pozbyć tego drugiego KAT_ID, który wplatając się zapycha mi jedną kolumnę wyników
blooregard
Cytat
Chciałbym się pozbyć tego drugiego KAT_ID, który wplatając się zapycha mi jedną kolumnę wyników

Pobierasz wszystkie kolumny (*) z dwóch tabel, w obu masz KAT_ID, dlatego dwa razy pojawia się on w wynikach.
Sprecyzuj kolumny, z kórych chcesz pobrać dane w zapytaniu SELECT, i tylko w jednej tabeli podaj KAT_ID.
Asmox
Wiem, że tak trzeba zrobić, ale niestety nie wiem jak. Czy mógłbyś mi pomóc?
P.S.: Wiem, że to prośba o gotowca, ale naprawdę nie wiem jak to zrobić.
phpion
Zamiast * podaj nazwy kolumn po przecinku (kolumna1, kolumna2). Jeżeli powtarzają się one w obu tabelach to podaj nazwa_tabeli.nazwa_kolumny.
Asmox
mysql> SELECT linki.LINK_ID, linki.TEMAT_ID, linki.LINK_NAZWA, tematy.TEMAT_NAZWA FROM linki
-> INNER JOIN tematy
-> ON linki.TEMAT_ID=tematy.TEMAT_ID;
W końcu to pomogło biggrin.gif
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.