![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 359 Pomógł: 12 Dołączył: 16.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
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? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Zapoznaj się z pojęciem normalizacji bazy danych (postacie normalne) i wówczas Twoje wątpliwości znikną.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 359 Pomógł: 12 Dołączył: 16.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
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?
|
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 36 559 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Teraz masz zrobione tak jak ma byc. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 2 Dołączył: 3.03.2009 Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 359 Pomógł: 12 Dołączył: 16.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dobrze więc, niech tak będzie.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 2 Dołączył: 3.03.2009 Ostrzeżenie: (0%) ![]() ![]() |
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`; |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 359 Pomógł: 12 Dołączył: 16.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Nie bardzo rozumiem Twój przykład, ale zainteresowałem się funkcją JOIN. Mam niestety problemy. Dla zapytania do MySQL:
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 Ten post edytował Asmox 6.03.2009, 15:47:49 |
|
|
![]()
Post
#9
|
|
Newsman Grupa: Moderatorzy Postów: 2 033 Pomógł: 290 Dołączył: 21.12.2007 Skąd: Łódź ![]() |
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. |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 359 Pomógł: 12 Dołączył: 16.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
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ć. |
|
|
![]()
Post
#11
|
|
Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Zamiast * podaj nazwy kolumn po przecinku (kolumna1, kolumna2). Jeżeli powtarzają się one w obu tabelach to podaj nazwa_tabeli.nazwa_kolumny.
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 359 Pomógł: 12 Dołączył: 16.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
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 (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 26.09.2025 - 16:46 |