![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 21.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam wszystkich,
jest to mój pierwszy post na tym forum. Planuję napisać prosty katalog firm - rejestracja, wyszukiwanie, promowane oferty itp. Przy pierwszym punkcie pojawia się mały problem, ponieważ mam w formularzu dużo pól: ------------------------------- - nazwa firmy - ulica - miasto - wojewodztwo - telefon1 - telefon 2 - www - godziny otwarcia (pon-pt; sob; nd) - krotki opis firmy - co robi (kilka pol do wyboru) ------------------------------- Początkowo chciałem to zrobić w jednej tabeli:
Jednak zdaje mi się, że to by było za dużo tego wszystkiego, jak wam się wydaje? Dzięki za odpowiedzi. Ten post edytował bahu232 25.08.2009, 16:03:02 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
To jak będzie wyglądać tabela zależy tylko i wyłącznie od tego JAKIE i ILE chcesz danych umieścić
Na pierwszy rzut oka: Wywal z tabeli: województwo(możesz ewentualnie zostawić tu id_województwa dla szybkości wyszukiwania), telefon i miasto(zostanie tu id_miasta) Zrób z nich osobne tabele: Tabela Telefon: ID_firmy(index), numer_telefonu Tabela Województwo ID_województwa(primary), nazwa_województwa Tabela Miasto ID_miasta(primary), ID_województwa(index), nazwa_miasta W tabeli firmy zaś zamiast miasta ustaw id_miasta Dzięki temu podziałowi będziesz mógł do firmy przypisać wiele telefonów, zmniejszysz tabelę firm o nadmiarowe kolumny oraz nieco sobie ułatwisz ewentualne zmiany na przyszłość w tabeli miast i województw. Co istotne, w tabeli firm będziesz miał szybsze wyszukiwanie po miastach i województwach, jeśli tam sobie indeksy założysz, bo będzie to o wiele szybsze niż działanie z użyciem LIKE (choć można niby założyć Full index tu na nazwę miasta, ale czy warto to nie jestem przekonany). To tak na szybko ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 65 Pomógł: 4 Dołączył: 6.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
Hej bahu232,
Pozwol prosze, ze sie dolacze w Twoim temacie ze swoim pytaniem (szkoda nowego tematu zakladac ![]() ![]() |
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Wyszukiwanie po int jest szybsze niż po stringu, do którego musisz użyć LIKE. Do tego po ustawieniu na obu indexów masz jeszcze przyspieszone to. Pojemność int jest wbrew pozorom dla bazy ciężka do wykorzystania szybko, bo kończy się gdzie powyżej 2 miliardów. A tyle rekordów raczej szybko nie przerobisz na swojej stronie
![]() Kolumna ID nie jest konieczna w każdym przypadku. Zależy to w dużej mierze od projektu bazy. Jeśli mamy gdzieś pole liczbowe unikatowe, to możemy mu ustawić indeks i wtedy sobie odpuścić możemy ID. Innymi słowy najważniejsze jest dobre przemyślenie bazy. Czasem lepiej jest nawet zdublować pole niż wyrzucić je całkowicie. Przykład mieliśmy nawet tutaj. Mogłem wyrzucić z tabeli Firmy id_województwa, gdyż miałbym tę daną po zrobieniu join z tabelą miast. Mogę jednak równie dobrze zostawić to pole i od razu mogę wyszukiwać firmy po województwie. Oszczędza mi to konieczność łączenia ewentualnego z tabelą miast. To jest jeden z wyborów wielu przed jakimi stają często projektanci baz: zrezygnować z dodatkowej kolumny na rzecz szybkości dostępu czy wyrzucić ją by uzyskać zmniejszenie jej wielkości. Posiedzisz trochę w bazach to takie myślenie się samo wkradnie ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 65 Pomógł: 4 Dołączył: 6.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
Wyszukiwanie po int jest szybsze niż po stringu, do którego musisz użyć LIKE. Do tego po ustawieniu na obu indexów masz jeszcze przyspieszone to. Pojemność int jest wbrew pozorom dla bazy ciężka do wykorzystania szybko, bo kończy się gdzie powyżej 2 miliardów. A tyle rekordów raczej szybko nie przerobisz na swojej stronie ![]() Dziekuje za odpowiedz ![]() ![]() |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 21.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
thek,
dzięki za odpowiedź. |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Jeśli będziesz miał w jakiś_string ciąg znaków a nie liczbę to baza może Ci przy użyciu = się burzyć, choć z reguły tego nie robi. Do stringów jest LIKE
![]() ![]() ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 65 Pomógł: 4 Dołączył: 6.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
yhm, okej dziekuje
![]() |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 21.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
thek,
jeśli dobrze rozumiem, ma to wyglądać jak poniżej? Kod CREATE TABLE `firma` ( `id` INT NOT NULL AUTO_INCREMENT , `nazwafirmy` TINYTEXT NOT NULL , `ulica` TEXT NOT NULL , `miasto` TEXT NOT NULL , `wojewodztwo` TEXT NOT NULL , `email` TEXT NOT NULL , `www` TEXT NOT NULL , `godzponpt` TEXT NOT NULL , `godzsob` TEXT NOT NULL , `godznd` TEXT NOT NULL , `opis` TEXT NOT NULL , `rodzaj` TEXT NOT NULL , `data` VARCHAR( 50 ) NOT NULL , PRIMARY KEY ( `id` ) ); CREATE TABLE `telefon` ( `id` INT NOT NULL AUTO_INCREMENT , 'numer_telefonu1` TINYTEXT NOT NULL , 'numer_telefonu2` TINYTEXT NOT NULL , PRIMARY KEY ( `id` ) ); CREATE TABLE `wojewodztwo` ( `id` INT NOT NULL AUTO_INCREMENT , `id_wojewodztwa` TINYTEXT NOT NULL , `nazwa_wojewodztwa` TEXT NOT NULL , PRIMARY KEY ( `id` ) ); CREATE TABLE `miasto` ( `id` INT NOT NULL AUTO_INCREMENT , `id_wojewodztwa` TINYTEXT NOT NULL , `nazwa_miasta` TEXT NOT NULL , PRIMARY KEY ( `id` ) ); 1. Jako miasto planowałem podstawić jakiś id (np. 1 - Gdańsk, 2 - Gdynia, 3 - Sopot itd.), podobnie chciałem zrobić z województwem (zamiast wysyłać całych nazw jak "Gdańsk"; "Gdynia" itp. > tylko ID). 2. To, że przedrostkiem nazwy jest "id_" coś zmienia? 3. Jak będę wysyłał dane z formularza to będę musiał osobno wysyłać dane do poszczególnych tabel? Dopiero zaczynam z MySQL, więc proszę o wyrozumiałość ![]() Ten post edytował bahu232 26.08.2009, 20:33:51 |
|
|
![]()
Post
#10
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
1. Jako miasto planowałem podstawić jakiś id (np. 1 - Gdańsk, 2 - Gdynia, 3 - Sopot itd.), podobnie chciałem zrobić z województwem (zamiast wysyłać całych nazw jak "Gdańsk"; "Gdynia" itp. > tylko ID).
2. To, że przedrostkiem nazwy jest "id_" coś zmienia? 3. Jak będę wysyłał dane z formularza to będę musiał osobno wysyłać dane do poszczególnych tabel? ad 1) I tak właśnie jest. Zauważ, że dlatego mam id zawsze indeksowane, by wyszukiwanie jeszcze przyspieszyć. ad 2) Nie zmienia nic. To jest dla czytelności kodu. Wiesz wtedy co jest kluczem do innej tabeli. ad 3) Poczytaj o UPDATE to się sam dowiesz czy możesz tak zrobić czy nie. Źle. Po pierwsze to mnóstwo razy text używasz, co już "na dzień dobry" spowalnia działanie bazy. Ogranicz się gdzie możesz do varchar. Miasto i wojewódzwo w tabeli firma to mają być INT, bo łączysz je po numerze województwa i numerze miasta. Właściwie to nawet w przypadku województwa możesz tinyint dać. Po co zmieniasz z mojego przykładu rzeczy ![]()
To tak ze zmianami na szybko... A czemu? Bo niezbyt jeszcze się orientujesz. Operacje na tekstach są wolniejsze niż na liczbach. Można to przyspieszyć poprzez tworzenie indexów na nich, ale index na danych testowych ma sens przy tworzeniu porządnej wyszukiwarki w oparciu o FULLTEXT. Poczytasz, wprawisz się to wtedy się za to weźmiesz. Na razie opanuj podstawy. dlaczego wywaliłem Ci drugi numer teleonu i zmieniłem nazwę z id na id_firmy? Bo co zrobisz jeśli do firmy masz nie 1 lub 2 ale 7 numerów? Dodasz kolejne pola? Nie w tabeli dodasz kolejny rekord. Po prostu zapytasz tabelkę: "Podaj mi wszystkie numery gdzie id_firmy równa się X". Nie prościej? W województwie wywaliłem id bo skoro jest id i id_województwa to te dane się dublują, więc jedna z kolumn zbędna. Nie wiem co to jest rodzaj, ale domyślam, że to typ działalności firmy (informatyczna, budowlana etc.), więc dorzuciłem jeszcze jedną tabelę I tu podobnie jak z telefonami, możesz przypisać firmę do kilku typów działalności. dopiero porządne zastanowienie się CO ma zawierać baza, JAK ma działać od strony użytkownika, ILE danych ma określonych zawierać sprawia, że się modeluje ją. Ja podałem Ci jak mniej więcej to widzę, ale dopiero znając dokładnie jej model zachowania, można ulepszać dalej. Ten post edytował thek 26.08.2009, 21:24:59 -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 01:44 |