WordPress-kehityksessä tulee ennemmin tai myöhemmin vastaan kysymys, joka jakaa mielipiteitä lähes filosofisella tasolla:
“Tarvitsemmeko oman tietokantataulun?”
Moni kehittäjä yrittää välttää custom-tauluja viimeiseen asti. Toiset taas rakentavat niitä innokkaasti heti kun data ei mahdu siististi post meta -malliin. Totuus, kuten yleensä, ei ole mustavalkoinen.
Kyse ei ole vain teknisestä valinnasta. Kyse on arkkitehtuurista, suorituskyvystä, skaalautuvuudesta ja datan luonteesta.
WordPressin oletusmalli: kaikki on postaus
WordPressin tietomalli on elegantin radikaali. Lähes kaikki on postaus:
-
sivut
-
artikkelit
-
custom post typet
-
tuotteet
-
tapahtumat
-
portfolio-itemit
Lisädata tallennetaan:
-
post meta -tauluun
-
term meta -tauluun
-
options-tauluun
Tämä tekee WordPressistä joustavan. Ei tarvitse skeemamuutoksia. Ei tarvitse migraatioita. Data vain… lisätään.
Mutta joustavuus ei ole ilmainen.
Milloin post meta alkaa hajota?
Post meta on loistava yleiskäyttöinen ratkaisu. Mutta se ei ole universaali tietokantarakenne.
Post meta alkaa muuttua ongelmalliseksi, kun:
-
dataa on paljon
-
kyselyt ovat monimutkaisia
-
tarvitaan relaatioita
-
suorituskyky on kriittinen
-
data ei ole luonteeltaan “sisältöä”
Post meta on käytännössä key-value -varasto. Se ei ole optimoitu analyyttiseen tai rakenteellisesti raskaaseen dataan.
Klassinen oire: meta_query-helvetti
Kun järjestelmä alkaa sisältää:
-
useita meta-ehtoja
-
range-hakuja
-
lajitteluja meta-arvojen mukaan
-
aggregaatioita
SQL alkaa näyttää siltä kuin joku olisi pudottanut lautasellisen spagettia näppäimistölle.
Ja suorituskyky kärsii.
Custom-taulu: mitä oikeasti saadaan?
Custom database table ei ole vain “uusi paikka datalle”. Se on täysin eri tietomalli.
Custom-taulu tarjoaa:
-
tarkasti määritellyn skeeman
-
oikeat datatyypit
-
indeksit
-
tehokkaat kyselyt
-
relaatiorakenteet
-
skaalautuvuuden
Post meta on joustava. Custom-taulu on strukturoitu.
Kyse on kompromissista joustavuuden ja tehokkuuden välillä.
Milloin custom-taulu on järkevä?
Custom-taulu alkaa olla perusteltu ratkaisu, kun data on:
-
määrällisesti suurta
-
rakenteellisesti monimutkaista
-
query-intensiivistä
-
ei-luonteeltaan “postaus”
Esimerkkejä:
-
logit
-
analytiikka
-
tapahtumastreamit
-
transaktiodata
-
relaatiopohjainen data
-
suuret listat
-
tilastot
-
rankingit
-
käyttäytymisdata
Post meta ei ole suunniteltu miljoonien rivien tehokkaaseen käsittelyyn.
Custom-taulu on.
Suorituskyky: elephant in the server room
Tietokantarakenne on suorituskykyarkkitehtuuria.
Post meta -mallissa jokainen haku tarkoittaa usein:
-
useita join-operaatioita
-
string-pohjaisia vertailuja
-
indeksirajoitteita
Custom-taulussa:
-
oikeat sarakkeet
-
oikeat indeksit
-
oikeat datatyypit
Tietokanta tekee sen, missä se on hyvä.
Skaalautuvuus ei ole teoreettinen ongelma
Pienessä projektissa post meta toimii lähes aina.
Kun data kasvaa:
-
queryt hidastuvat
-
CPU kuormittuu
-
välimuisti alkaa paikata arkkitehtuuria
Custom-taulu ei ole optimointi. Se on joskus välttämättömyys.
Datan semantiikka: kaikki ei ole sisältöä
WordPressin postausmalli on sisältökeskeinen.
Mutta kaikki data ei ole sisältöä.
Esimerkiksi:
-
käyttäjäaktiviteetit
-
API-vastaukset
-
sensoridata
-
laskennalliset tulokset
-
tilastot
-
session data
Näiden mallintaminen postauksiksi on usein semanttisesti kömpelöä.
Custom-taulu antaa datalle oman identiteetin.
Relaatiot: post meta vs oikea tietomalli
Post meta ei ole relaatiomalli. Se on attribuuttivarasto.
Jos tarvitset:
-
monimutkaisia suhteita
-
viittauksia
-
aggregaatioita
-
tehokkaita join-kyselyitä
Custom-taulu alkaa näyttää houkuttelevalta.
Tietokannat on suunniteltu relaatiodatalle. Post meta on kompromissi.
Miksi custom-tauluja vältellään?
Koska ne tuovat vastuuta.
Post meta:
-
ei vaadi skeemasuunnittelua
-
ei vaadi migraatioita
-
ei vaadi versiokontrollia rakenteelle
Custom-taulu:
-
vaatii skeeman
-
vaatii päivityslogiikan
-
vaatii uninstall-logiikan
-
vaatii indeksisuunnittelun
-
vaatii ylläpidon
Custom-taulu on arkkitehtuuripäätös, ei koodikikka.
Ekosysteemin yhteensopivuus
WordPressin oletusrakenne toimii suoraan:
-
WP_Queryn kanssa
-
REST API:n kanssa
-
admin-näkymien kanssa
-
core-työkalujen kanssa
Custom-taulu:
-
ei integroidu automaattisesti
-
vaatii oman querylogiikan
-
vaatii oman API-kerroksen
-
vaatii oman admin-logiikan
Saat suorituskykyä. Menetät automaatiota.
Hybridimallit: yleinen käytännön ratkaisu
Monet kypsät WordPress-arkkitehtuurit käyttävät hybridimallia.
Postaukset:
-
sisältö
-
URLit
-
editori
-
käyttöliittymä
Custom-taulu:
-
raskas data
-
logit
-
analytiikka
-
relaatiorakenteet
Tämä yhdistää WordPressin UX-edut ja tietokannan tehokkuuden.
Klassinen väärinkäyttö: custom-taulu ilman syytä
Custom-taulu ei ole automaattisesti “parempi”.
Huono perustelu:
-
“Haluan tehdä tämän oikein”
Hyvä perustelu:
-
“Post meta ei skaalaudu tähän käyttötapaukseen”
Yksinkertainen data + custom-taulu = turha kompleksisuus.
Tulevaisuusajattelu vs premature optimization
Yksi vaikeimmista kysymyksistä:
Optimoidaanko tulevaisuutta varten vai nykytilaa varten?
Liian aikainen custom-taulu:
-
lisää kompleksisuutta
-
hidastaa kehitystä
-
kasvattaa ylläpitokustannuksia
Liian myöhäinen custom-taulu:
-
suorituskykyongelmia
-
migraatio-ongelmia
-
teknistä velkaa
Kyse ei ole säännöstä. Kyse on kontekstista.
Lopuksi: custom-taulu on datamallipäätös
Custom database table ei ole WordPress-temppu. Se on tietomallipäätös.
Se kysyy:
-
millaista dataa käsittelemme?
-
kuinka paljon dataa tulee?
-
miten dataa haetaan?
-
miten data kasvaa?
-
mikä on suorituskykyvaatimus?
Post meta on joustava yleisratkaisu.
Custom-taulu on spesialisoitu työkalu.
Hyvä arkkitehtuuri ei kysy:
“Kumpi on parempi?”
Hyvä arkkitehtuuri kysyy:
“Kumpi sopii tähän ongelmaan?”
Ja juuri siinä kohtaa WordPress-kehitys muuttuu koodauksesta systeemiajatteluksi.
