Već skoro godinu dana kao CMS koji radi u pozadini ovog bloga “radi” prilično širokozastupljeni bBlog, zasnovan na još poznatijem Smarty šablonu. Zahvaljujući posvećenosti ovom CMS-u i velikim mogućnostima kastomizacije ovog sistema, uspeo sam potpuno da ga prilagodim mojim očekivanjima i potrebama.
PHP funkcije oko kojih je izgrađen ovaj sistem su poprilično transparentne, pokrivne odgovarajućim komentarima i lake za modifikovanje, naravno uz poznavanje bar osnova PHP jezika. Ali, ono što može da predstavi potencijalni problem je baza podataka, odnosno njena neadekvatna organizacija (model podataka) koja nije zasnovana na osnovnim principima projektovanja relacionih (radi se o rel. bazi) baza podataka.
Jedan od vrlo ilustrativnih primera nepravilnosti je neadekvatno postavljena relacija između dve tabele (dva tipa entiteta), tabele Postovi (bb_posts) i tabele Sekcije (bb_sections), koja strukturalno ni ne postoji. Veza između ove dve tabele uspostvljena je preko polja sections u tabeli bb_posts i polja sectionid u tabeli bb_sections.
Pri tome ova dva polja su totalno različitih tipova podataka, polje sections u tabeli bb_posts je tipa varchar(255), dok je polje polja sectionid u tabeli bb_sections tipa int(11), što prouzrokuje nemogućnost uspostavljanja direktne relacije između ove dve tabele. Primer sadržaja obeležja (polja) sections u tabeli bb_posts je sledeća:
Znači, imamo tekst polje (?!) koji nosi podatak o pripadnosti zapisa određenim sekcijama, a relacija je uspostavljena PHP funkcijom koja parsira sadržaja ovog polja i zatim rezultat povezuje sa sadržajem polja obeležja sectionid u tabeli bb_sections.
Autor ovog „modela podataka“ nije uzeo u obzir kardinalitete obeležja dva tipa entiteta prilikom postavljanja relacije. Radi se o relaciji dva tipa entiteta koja prema kardinalitetima pripada grupi N:N tipova poveznika (relacija), što se u relacionom modelu može predstaviti samo putem uvođenja posebne šeme relacije (relacija koja sadrži sva obeležja i sva ograničenja tipa entiteta), tj. nove tabele. Na slici je dat prikaz pravilne molekularne ER šeme sa tipovima entiteta:
- Zapis,
- Sekcija i
- tipom poveznika Pripada
(prema pravilu, nazivi tipova entiteta trebale bi da budu imenice u jednini).
Makismalne vrednosti kardinaliteta polja Zapis i Sekcija ukazuju na to da jedan zapis može da pripada (svrsta) većem broju sekcija bloga (najmanje jednoj), i da istotovremeno u jednu sekciju može da se uvrsti više zapisa na blogu. Minimalni kardinalitet 0 (nula) na strani Sekcije, dozvoljava da neke sekcije, u datom trenutku, ne moraju da imaju nijedan pridruženi zapis.
Samo ovako postavljen model garantuje integritet podataka i uopšte mogućnost postavljanja SQL upita kojima se gradi ova ili bilo koja druga aplikacija.