ugrás a tartalomhoz

Adatbázis tervezet ellenőrzés kérelem

Shokkk · 2006. Május. 20. (Szo), 16.57
Sziasztok. valaki, aki nagyon ráér meg tudná nézni nekem, hogy ez így jó-e, vagy túl van bonyolítva? vagy ha esetleg valami nagyon nem jó benne rámszólna? előre is köszi.

Ez elméletben egy olyan adatbázis, amiben majd különböző szakmák cégeit lehet majd lekérdezni település szerint. Előre is nagyon köszönöm :))
CREATE TABLE Cég (
  idCég INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  Név VARCHAR NULL,
  Cím VARCHAR NULL,
  Telefonszám VARCHAR NULL,
  E-mail VARCHAR NULL,
  webcím VARCHAR NULL,
  bejegyzés dátuma DATE NULL,
  lejárat dátuma DATE NULL,
  PRIMARY KEY(idCég)
);

CREATE TABLE Megye (
  idMegye INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  Cég_idCég INTEGER UNSIGNED NOT NULL,
  Ország VARCHAR(45) NULL,
  Megye VARCHAR(45) NULL,
  PRIMARY KEY(idMegye, Cég_idCég),
  INDEX Megye_FKIndex1(Cég_idCég)
);

CREATE TABLE Munkakör (
  idMunkakör INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  Cég_idCég INTEGER UNSIGNED NOT NULL,
  Szakma VARCHAR NULL,
  PRIMARY KEY(idMunkakör, Cég_idCég),
  INDEX Munkakör_FKIndex1(Cég_idCég)
);

CREATE TABLE Város (
  idVáros INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  Megye_idMegye INTEGER UNSIGNED NOT NULL,
  Cég_idCég INTEGER UNSIGNED NOT NULL,
  Város VARCHAR(45) NULL,
  PRIMARY KEY(idVáros, Megye_idMegye, Cég_idCég),
  INDEX Város_FKIndex1(Megye_idMegye),
  INDEX Város_FKIndex2(Cég_idCég)
);
 
1

Ékezetek

Bártházi András · 2006. Május. 20. (Szo), 17.13
Csak ékezeteket ne használj, mert csak szívni fogsz vele.
2

Jól látom...

janoszen · 2006. Május. 20. (Szo), 17.40
Jól látom, hogy itt a Megyék táblában van a céghivatkozás, nem a cégtáblában a megyehivatkozás? Ez miért jó?

És miért nem használsz távoli kulcsokat?
5

használ, csak nem tudja? ;)

Hodicska Gergely · 2006. Május. 20. (Szo), 23.10
És miért nem használsz távoli kulcsokat?

Szerintem használ (itthon inkább külső kulcsnak hívják), legalábbis az indexek nevében az az "_FK" elég gyanús, csak gondolom a generátor progi a script végére tette őket alter table formában.


Felhő
3

javaslatok

Balogh Tibor · 2006. Május. 20. (Szo), 18.14
- Feltétlenül add meg a mező méretét szöveges mezőnél, varchar(70).
- Ahol nem lehet null a mező, ott feltétlenül legyen not null jelzés.
- Ne a megye táblában legyen az ország jelzés. Ha mégis, akkor ne szövegesen.

CREATE TABLE ceg (
	ceg_id   INTEGER UNSIGNED NOT NULL auto_increment,
	ceg_nev  VARCHAR(120) NOT NULL,
	
	varos_id INTEGER UNSIGNED NOT NULL, #Ugyanolyan típus, mint a varos tablánál
	munkakor_id INTEGER UNSIGNED NOT NULL, #Ha több is tartozik hozzá, akkor egy kapoló tábla kell
	...	
);

CREATE TABLE varos (
	varos_id  INTEGER UNSIGNED NOT NULL auto_increment, #Nem feltétlenül kell INTEGERT használni.
	varos_nev VARCHAR(37) NOT NULL,
	
	megye_id  INTEGER UNSIGNED NOT NULL, #A megye táblának megfelelően
	orszag_id INTEGER UNSIGNED NOT NULL, #Bár ez kiderülne a megyéből is, érdemes lehet külön kezelni
	...
);
4

Köszi :)

Shokkk · 2006. Május. 20. (Szo), 20.33
Köszi az edigi tippeket :)

az indexeket muszáj amúgy belerakni, vagy anélkül is értelmes marad?
mert én úgy számoltam, hogy csak fölösleges adat... vagy nem? :D

Egyébként azért raktam az országot és a megyét egy táblába, mert ha van külön ország+ország kulcs, akkor az ország kulcsot kell tárolni a megye táblába, és van még egy plusz tábla, szerintem feleslegesen..
nem jól látom?
7

Köszi

Balogh Tibor · 2006. Május. 21. (V), 13.51
az indexeket muszáj amúgy belerakni, vagy anélkül is értelmes marad?
mert én úgy számoltam, hogy csak fölösleges adat... vagy nem?
  • Nem, nem muszáj indexeket belerakni.
  • Az adatbázis értelmes maradhat a nélkül is, csak lassan fognak lefutni a lekérdezések, és gyorsabban az adatbevitelek.
  • Az index a legkisebb mértékben sem fölösleges adat.


ha van külön ország+ország kulcs, akkor az ország kulcsot kell tárolni a megye táblába, és van még egy plusz tábla, szerintem feleslegesen.. nem jól látom?
  • Nem, nem jól látod.
  • Többek között az ellenőrzést segíti, ha kulcsként hivatkozol az értékre.
  • Mi történik akkor, ha adatfelvételnél elütöd, és Magyarország helyett Magyraországot veszel fel?
  • További adatokat is megadhatsz majd az országokhoz.
  • Ha mégsem akarsz új táblát, akkor használhatsz felsorolás (enum) típust.
8

:))

Shokkk · 2006. Május. 21. (V), 15.27
Ok, meggyőztél :)
10

Off

Balogh Tibor · 2006. Május. 21. (V), 15.53
Kezd "sokkolni" ez a sok szmájli.
Megtennéd, hogy kevesebbet használod őket! Mondjuk ott, ahol ennek van is jelentősége és értelme.
11

reOFF

Shokkk · 2006. Május. 21. (V), 16.32
sajnálom, alapvetően mosolygós ember vagyok, és ezt írásban is szeretem kifejezni.. de elnézést, ha nem vagyok elég komoly a témához ;) Egyébként azt gondolom, hogy mindenki kifejezheti magát írásban úgy, ahogy neki tetszik... nem kiabáltam, nem írtam le ugyanazt 120x, nem beszéltem csúnyán, stb, stb, szal szerintem nem vétettem a közizlés ellen. Ha mosolygásommal ezt mégis megtettem, hát elnézést érte, majd igyekszem komolykodni.

Egyébként meg csak annak örülök, hogy kifejezetten hasznos tippeket kapok itt, (és reméllem nem csak nekem hasznos, hanem egyéb "kezdőknek" is) és jó tudni, hogy van hova fordulni ha a programozás egyik területéhez valaki nem ért.. ennyi. Ez számomra egy kellemes meglepetés volt és örültem neki, és ezt ki is fejeztem a magam módján. Ha ez másokat zavar, hát ... bocsánat érte.
6

kuszaság (normál forma)

Hodicska Gergely · 2006. Május. 20. (Szo), 23.50
Jelen kialakításban a tábláid többségének (3 db) nincs igazából értelme, ugyanolyan, mintha 1 db cég táblád lenne csak. Az adatbázis tervezés egyik alapvető célja az lenne, hogy egy olyan struktúrát alakíts ki, melyben nem tárolsz redundáns adatokat. A redundancia különböző adatkezelési anomáliákat vet fel, ezek kivédésére vezették be a különböző normál formákat. Erre nyugodtan rákereshetsz, lehet találni magyar nyelvű leírásokat is. (Persze van, amikor a túlzott normalizálásnak is lehet negatív hatása, de jelen helyzet nem ilyen.)

Azzal, hogy minden a céghez kapcsolódó táblában benne van a cég azonosítója is a kulcsban, azzal azt éred el, hogy minden egyes céghez minden esetben fel kell venned egy külön megye, munkakör és város sort. Ez elég sok problémát vet fel.
  • minden egyes cég miatt le lesz tárolva a megye neve feleslegesen. hasonló, hasonlóan igaz ez szakma, város nevére.
  • megváltozik mondjuk egy város neve, akkor több sort kell emiatt updatelned, nehéz lesz megőrizned az adatok konzisztenciáját.

A gond a különböző entitások közötti kapcsolatok tárolásából adódik. Pl. ha egy cég csak egy városban lehet, akkor tárold le külön a város adatokat, majd a cég táblában legyen egy darab város azonosító. Ha egy cégnek több munkaköre lehet (és egy munkakör is több céghez tartozhat), akkor külön cég adatok, külön munkakör adatok, majd kell egy külön kapcsoló tábla, amiben tudod tárolni a kapcsolatokat.

Valami hasonló lehetne:
  • ceg(ceg_id, varos_id, ...)
  • orszag(orszag_id, )
  • megye(megye_id, orszag_id, ...)
  • varos(varos_id, megye_id, ...)
  • munkakor(munkakor_id, ...)
  • ceg_k_munkakor(ceg_id, munkakor_id)

Vastag: kulcs mező, dőlt: külső kulcs mező.


Felhő
9

Jogos

Shokkk · 2006. Május. 21. (V), 15.33
Igaz, átgondolva több szempontból sem praktikus így..

és ha mondjuk külön kapcsoló táblát csinálnék cég(ceg_id, megye_id, város_id)
és külön egyet szakmának? és akkor nincs olyan gond, hogy minden egyes adatot feleslegesen kétszer tárol, ha két szakma van, vagy 2 megye... tehét egyszer lenne minden megye, város és szakma és cég letárolva, és külön 2 tábla van a kapcsolatoknak.

így jól okoskodok? :))


Ez talán azért lenne praktikusabb, mert így a keresést 2, csak kulcsokat tartalmazó táblában meg lehet oldani.. és ha jól sejtem így lényegesen gyorsabb :))


tehát most valahogy így nézne ki:
CREATE TABLE Ceg (
  idCeg INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  Nev VARCHAR(45) NULL,
  Cim VARCHAR(45) NULL,
  Telefonszam VARCHAR(20) NULL,
  E-mail VARCHAR(45) NULL,
  webcim VARCHAR(45) NULL,
  bejegyzes datuma DATE NULL,
  lejarat datuma DATE NOT NULL,
  PRIMARY KEY(idCeg)
);

CREATE TABLE Megye (
  idMegye INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  Orszag_idOrszag INTEGER UNSIGNED NOT NULL,
  Megye VARCHAR(45) NOT NULL,
  PRIMARY KEY(idMegye, Orszag_idOrszag),
  INDEX Megye_FKIndex1(Orszag_idOrszag)
);

CREATE TABLE MunkaCeg (
  Ceg_idCeg INTEGER UNSIGNED NOT NULL,
  Munkakor_idMunkakor INTEGER UNSIGNED NOT NULL,
  PRIMARY KEY(Ceg_idCeg, Munkakor_idMunkakor),
  INDEX MunkaCeg_FKIndex1(Ceg_idCeg),
  INDEX MunkaCeg_FKIndex2(Munkakor_idMunkakor)
);

CREATE TABLE Munkakor (
  idMunkakor INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  Szakma VARCHAR(45) NOT NULL,
  PRIMARY KEY(idMunkakor)
);

CREATE TABLE Orszag (
  idOrszag INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  Orszag VARCHAR(45) NOT NULL,
  PRIMARY KEY(idOrszag)
);

CREATE TABLE Table_08 (                 (ez a város, megye cég kapcsolat lenne)
  Ceg_idCeg INTEGER UNSIGNED NOT NULL,
  Megye_Orszag_idOrszag INTEGER UNSIGNED NOT NULL,  (ezt kivenném, vagy ne?)
  Megye_idMegye INTEGER UNSIGNED NOT NULL,
  Varos_Megye_idMegye INTEGER UNSIGNED NOT NULL,  (ezt is)
  Varos_Megye_Orszag_idOrszag INTEGER UNSIGNED NOT NULL,  (ezt is)
  Varos_idVaros INTEGER UNSIGNED NOT NULL,
  PRIMARY KEY(Ceg_idCeg, Megye_Orszag_idOrszag, Megye_idMegye, Varos_Megye_idMegye, Varos_Megye_Orszag_idOrszag, Varos_idVaros),
  INDEX Table_08_FKIndex1(Ceg_idCeg),
  INDEX Table_08_FKIndex2(Megye_idMegye, Megye_Orszag_idOrszag),
  INDEX Table_08_FKIndex3(Varos_idVaros, Varos_Megye_Orszag_idOrszag, Varos_Megye_idMegye)
);

CREATE TABLE Varos (
  idVaros INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  Megye_Orszag_idOrszag INTEGER UNSIGNED NOT NULL,  (ezt is)
  Megye_idMegye INTEGER UNSIGNED NOT NULL,
  Varos VARCHAR(45) NULL,
  PRIMARY KEY(idVaros, Megye_Orszag_idOrszag, Megye_idMegye),
  INDEX Varos_FKIndex1(Megye_idMegye, Megye_Orszag_idOrszag)
);

ahol azt írtam a sor végére, hogy kivenném azt azért venném ki, mert szerintem felesleges adatduplázás, de mivel nem vagyok biztos benne ezért benthagytam, hátha ti mást mondotok :)) (értelem szerűen ilyen helyeken az indexeket is kivenném, csak az nem fért oda)