Pošto u zadnje vrijeme svašta nešto normaliziram…evo još jednog meni jako važnog djela.
Znači ideja je da se struktura baze održava kroz nekakvu schemu koja je pregledna i koju je jednostavno održavati.
Tako radim skoro otkako radim sa bazama i stvar je od neprocjenjive vrijednosti.
Naravno, kako je taj pristup odličan… onda taj pristup nije gotovo nitko zaobišao…tako da mnogi frameworci imaju opciju održavanja strukture baze tako nekim pristupom.
No ono što sam do sada vidio unutar drugih frameworka, je po malo promašilo footbal.
Mnogi od njih su tu strukturu održavanja baze isprepleli sa funkcijama i code-om samog frameworka…a to nikako nije cilj. U najamanju ruku je problem što onda ta struktura nije lako prenosiva…a i svašta još nešto se za time povlači.
Stoga najveći benefit bi bio za sve strane da se osmisli buety sintaksa koja je jednostavna za pisati…koja nije zagađena nikakvom suvišnom sintaksom …i onda da se frameworci oslanjaju na tu sintaksu da dalje po njoj održavaju strukturu baze.
Ja sam to osobno u svom frameworku izveo na način da framework samostalno prepozna ako sam mijenjao nešto unutar scheme baze …i onda automatski restruktuira bazu…tako da ne moram niti kucati nekakve glupave naredbe kroz konsolu tipa: “Add migration → update database”.
Što bi to kucao? Ako sam promjenio schemu to je već dovoljan znak frameworku da želim da baza prati tu strukturu. I to onda radi glatko i tečno…
U tu svrhu ću predstaviti najjednostavniju sintaksu do koje sam uspio doći…koja se lako parsira i lako širi sa novim metapodacima, jer sigurno da nisam uveo sve metapodatke u startu…
Sintaksa je sama po sebi skroz intuitivna:
table_prefix = system
table_used = car*, accident
component=system
engine=InnoDB
charset=utf8
collate=utf8_bin
car
carID INT UNSIGNED NOT NULL
color VARCHAR(10)
hp INT UNSIGNED
date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
PRIMARY KEY (carID)
comment=This is table about cars
car_accidents
rowID INT UNSIGNED NOT NULL
carID INT UNSIGNED
accidentID INT UNSIGNED
date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
PRIMARY KEY (rowID)
UNIQUE(carID, accidentID)
charset=utf16
accident
accidentID INT UNSIGNED NOT NULL
country VARCHAR(50)
city VARCHAR(50)
date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
PRIMARY KEY (accidentID)
INDEX(country,city)
A evo je i sa pojašnjenjima pod kojim pravilima mora biti pisana:
// metadata of .dbs schema, for example...
table_prefix = system // prefix addad to any of table name below
table_used = car*, accident // list of table which will be generated from tables below. For listing tables it's used syntax described >here<
component=system // component name associated with tables below -> it can help system to organize tables with different databases.
engine=InnoDB // master configuration for all tables...it can be overwrited for any table independent
charset=utf8 // -- || --
collate=utf8_bin // -- || --
comment= some master comment // -- || --
car
carID INT UNSIGNED NOT NULL
color VARCHAR(10)
hp INT UNSIGNED
date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
PRIMARY KEY (carID)
comment=This is table about cars
car_accidents
rowID INT UNSIGNED NOT NULL
carID INT UNSIGNED
accidentID INT UNSIGNED
date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
PRIMARY KEY (rowID)
UNIQUE(carID, accidentID)
charset=utf16
accident
accidentID INT UNSIGNED NOT NULL,
country VARCHAR(50),
city VARCHAR(50),
date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (accidentID),
INDEX(country,city),
/*
Table schema block, upute:
Prva linija je ime tablice. Ta linija ne smije sadržavati ništa u svom retku, tj. mora se nalaziti samostalno u svom redu. Po tom pravilu se djele table-blokovi
Nakon toga dolazi popis definicija polja tablice. Te definicije su ekvivalente SQL definicijama polja, osim što svako polje mora biti opisano u svom retku, ali zato definicija polja ne mora završavati razmakom.
Nakon popisanih polja, mora biti navedeno PIRMARY KEY polje
Nakon PRIMARY KEY-a mogu biti dodani meta-podaci o tablici koji mogu sadržavati: (U uglatim zagradam su popisane defaultne vrijednosti tih parametara)
- index
- unique
- engine [InnoDB]
- charset [utf8]
- collate [utf8_bin]
- comment
Format pisanja metapodataka može biti na dva načina, npr. sljedeće dvije instrukcije imaju isto značenje:
INDEX = carID
INDEX(carID)
Ali svaki meta-podatak mora ići u novu liniju!
*/
Svaka sugestija što smatrate da bi bilo nezaobilazno u startu uvesti u tu sintaksu, je dobrodošla.