FriendFeedillä on kiintoisa tietokantaratkaisu. He ovat rakentaneet CouchDB:n kaltaisen dokumenttitietokannan MySQL:n päälle. Ideana on tallentaa varsinainen data JSON-enkoodattuna yhteen ainoaan blob-sarakkeeseen. Haut tehdään käyttäen erillisiä aputauluja, joissa on tarvittavat kentät indeksoituna.

Ratkaisu ei ole kovin relaatiomallin mukainen, mutta vaikuttaa toimivalta, olettaen että järjestelmää käytetään aina dataobjektien läpi. Ja niinhän nykyään useimmiten tehdäänkin. Dataobjektit huolehtivat, että blobiin tallentuu esimerkiksi tällainen JSON-dokumentti:

 {"name": "John Doe",
  "email": "john.doe@example.com"}

Sitten ne tallentavat index_name-tauluun name-kentän ja index_email-tauluun email-kentän. Näitä pidetään yllä aina kun dokumentteja lisätään, muokataan tai poistetaan. Tuosta on aika helppo tehdä yleiskäyttöinen siten, että jossain konfiguraatiotiedostossa kerrotaan mitkä JSON-kentät indeksoidaan omiin tauluihinsa, ja vaikka automaattisesti ajaa CREATE TABLE:tkin tarvittaessa.

Suurin ongelma, jonka näen tässä ratkaisussa, on yksittäisten kenttien päivittäminen JSON-blobien sisältä. CouchDB tukee tällaista natiivisti, mutta MySQL:n blobikentät pitäisi aina lukea kannasta, muokata JSONia, ja tallentaa blobi takaisin kantaan. Tämän tehokkuus riippuu pitkälti siitä, tarvitseeko tehdä paljon multi-row-updateja, vai muokataanko sovelluksessa yleensä vain yhtä tietokantariviä kerralla.

Joka tapauksessa ratkaisu on kiinnostava, ja sitä voisi ehkä käyttää välivaiheen tietokantavarastona CouchDB:n stabiilia 1.0:aa odotellessa. Tällä tavalla voisi myös simuloida Google DataStore APIa MySQL:ää käyttäen, AppStore-sovellusten ajamiseksi omalla palvelimella.

Published 28.2.2009