Nekaj dni nazaj sem pisal o dedovanju tabel v PostgreSQL in problemih na katere sem naletel. Našel sem rešitev, ki sicer ni tako elegantna kot native table inheritance, deluje pa vseeno zelo lepo.
Začeli bomo tako, kot je predlagal David v komentarjih na članek o dedovanju tabel:
Zakaj sem pred imena tabel dodal underscore znak? Ker bomo kreirali viewje z imeni brez tega znaka, nad katerimi bomo izvajali INSERT in UPDATE operacije, na ta način bomo dosegli obnašanje, ki je podobno dedovanu tabel.
Ampak samo malo, saj ne moremo izvajati INSERT in UPDATE operacij nad viewji, ali pač? Neposredno seveda ne, lahko pa to naredimo z majhnim trikom. Na viewjih bomo definirali INSERT in UPDATE rules, ki bodo skrbeli, da se osvežijo podatki v pravi tabeli. Pa dajmo, najprej INSERT:
Nato še UPDATE:
No, vse skupaj se sedaj obnaša zelo podobno, kot bi se v primeru uporabe dedovanja tabel. Pa smo s tem rešili tudi moj problem iz prejšnjega članka? Seveda smo, v tabeli artikli se sedaj nahajajo vsi zapisi in lahko na ID polje v tej tabeli referenciramo tudi kakšen FOREIGN KEY. Poskusimo primer iz prejšnjega članka:
Dodamo artiklu z ID številko 1 neke dodatne lastnosti:
Odlično! Zadeva tokrat deluje! Smo pa kar zakomplicirali vse skupaj, kajne? To je slaba lastnost te rešitve, dobra pa je, da baza sama skrbi za konsistentnost podatkov v tabelah, in mi v kodi ne rabimo razmišljat o tem, v katerih tabelah so kateri podatki in kako jih moramo povezat, da se kaj ne izgubi.