Jak najlepiej zrobić baze do takiej strony?


(stanek.94) #1

Witam! Tworzę katalog firm i nie wiem jakby tu zrobić sensownie baze. Chciałbym żeby był podział na typ->kategoria->miasto->firma np. gastronomia->fast food->Kraków->mcdonald.

Zamierzam zrobić 4 tabele: firmy, kategorie, miasta i typy

firmy :

id int AUTO_INCREMENT, 

	nazwa varchar(20),

	adres text,

	telefon varchar(10),

	miejscowosc varchar(20),

	typ varchar(20),

	tekst text,

miasta:

id int AUTO_INCREMENT, 

	miasto varchar(20),

typy

id int AUTO_INCREMENT, 

	typ varchar(40),

 idkategori varchar(10),

kategoria:

id int AUTO_INCREMENT, 

	kategoria varchar(40),

I robić to tak że wyświetlają się z bazy wszystkie typy, ktoś wybiera typ to pokazują sie powiązanie z nim kategorie, potem wszystkie miasta a nastepnie firmy z tego miasta o tej kategorii. Myślicie ze to dobre rozwiązanie? Będzie sie strasznie dużo łaczyć z bazą :confused:


(Konrad Kosowski) #2

Założenia masz prawie dobre…

Na pewno trzeba wszystko rozbić na osobne tablice i wszystko spiąć relacjami. Mniej więcej tak:

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

-- Table `mydb`.`kategorie`

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

CREATE TABLE IF NOT EXISTS `mydb`.`kategorie` (

  `id` INT NOT NULL AUTO_INCREMENT ,

  `kategoria` VARCHAR(40) NULL ,

  PRIMARY KEY (`id`) )

ENGINE = InnoDB;

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

-- Table `mydb`.`typy`

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

CREATE TABLE IF NOT EXISTS `mydb`.`typy` (

  `id` INT NOT NULL AUTO_INCREMENT ,

  `typ` VARCHAR(40) NULL ,

  `kategorie_id` INT NOT NULL ,

  PRIMARY KEY (`id`, `kategorie_id`) ,

  INDEX `fk_typy_kategorie_idx` (`kategorie_id` ASC) ,

  CONSTRAINT `fk_typy_kategorie`

    FOREIGN KEY (`kategorie_id` )

    REFERENCES `mydb`.`kategorie` (`id` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB;

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

-- Table `mydb`.`masta`

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

CREATE TABLE IF NOT EXISTS `mydb`.`masta` (

  `id` INT NOT NULL AUTO_INCREMENT ,

  `miasto` VARCHAR(20) NULL ,

  PRIMARY KEY (`id`) )

ENGINE = InnoDB;

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

-- Table `mydb`.`firmy`

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

CREATE TABLE IF NOT EXISTS `mydb`.`firmy` (

  `id` INT NOT NULL AUTO_INCREMENT ,

  `nazwa` VARCHAR(20) NULL ,

  `adres` TEXT NULL ,

  `telefon` VARCHAR(10) NULL ,

  `tekst` TEXT NULL ,

  `typy_id` INT NOT NULL ,

  `typy_kategorie_id` INT NOT NULL ,

  `masta_id` INT NOT NULL ,

  PRIMARY KEY (`id`, `typy_id`, `typy_kategorie_id`, `masta_id`) ,

  INDEX `fk_firmy_typy1_idx` (`typy_id` ASC, `typy_kategorie_id` ASC) ,

  INDEX `fk_firmy_masta1_idx` (`masta_id` ASC) ,

  CONSTRAINT `fk_firmy_typy1`

    FOREIGN KEY (`typy_id` , `typy_kategorie_id` )

    REFERENCES `mydb`.`typy` (`id` , `kategorie_id` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION,

  CONSTRAINT `fk_firmy_masta1`

    FOREIGN KEY (`masta_id` )

    REFERENCES `mydb`.`masta` (`id` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB;

Do tego dorobić odpowiedni widok i liczba query idzie w dół, baza nie puchnie bez sensu i jest zgodnie z zasadami sztuki.


(stanek.94) #3

A te referencje są konieczne? :confused: Bo ja je średnio ogarniam : /


(Konrad Kosowski) #4

Nie są konieczne. Możesz robić mniej więcej tak, jak piszesz, tylko uważaj na takie kwiatki:

id int AUTO_INCREMENT,

   typ varchar(40),

 idkategori varchar(10),

Skoro w tablicy kategoria id jest typu int. Podobnie w w tablicy firmy.


(stanek.94) #5

Dzięki, a jeszcze takie pytanie: Jak będę miał listę kategorii i listę miast, a tego wszystkiego będzie po około 200 i chciałbym żeby pokazywało przy każdym miescie i kazdej kategorii ilość ofert w tym miescie i w tej kategorii to czy gdy wtedy zrobię do każdego oddzielnie żeby liczyło w bazie pasujące oferty i wypisywało to chyba spowolni trochę stronę? Bo przy każdym wejściu będzie 200 razy liczyło z bazy :?


(kostek135) #6

Przy 200 to nie ma znaczenia. Przy większej ilości mógłbyś się zastanowić czy nie lepiej zrezygnować z żółwia jakim jest 3NF (super sprawa w zastosowaniach akademickich i niech tam pozostanie, bo chyba nikt w biznesie na poważną skalę tego nie używa), na rzecz rozwiązań typowych dla hurtowni danych.