AntonioGanci

Il blog di Antonio Ganci
posts - 201, comments - 420, trackbacks - 31

Schema-less Databases

Jacopo mi ha segnalato questo post, in cui viene spiegato come FriendFeed memorizza su un database MySQL dati schema-less.

L'idea è quella di memorizzare una versione serializzata delle nostre entities, nel caso di FriendFeed in formato JSON. La tabella ha la seguente struttura:

CREATE TABLE entities (
    added_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    id BINARY(16) NOT NULL,
    updated TIMESTAMP NOT NULL,
    body MEDIUMBLOB,
    UNIQUE KEY (id),
    KEY (updated)
) ENGINE=InnoDB;

La cosa, che trovo, interessante è la motivazione che ha spinto ad adottare tale struttura cito dal post:

As our database has grown, we have tried to iteratively deal with the scaling issues that come with rapid growth. We did the typical things, like using read slaves and memcache to increase read throughput and sharding our database to improve write throughput. However, as we grew, scaling our existing features to accomodate more traffic turned out to be much less of an issue than adding new features.

In particular, making schema changes or adding indexes to a database with more than 10 - 20 million rows completely locks the database for hours at a time. Removing old indexes takes just as much time, and not removing them hurts performance because the database will continue to read and write to those unused blocks on every INSERT, pushing important blocks out of memory.

Ayende ne parla nel post Designing a document database: What next? ed esiste anche un'implementazione open source chiamata CouchDB

Questa idea è un'eventuale alternativa ai classici database relazionali, nel caso in cui ci si trovi in condizioni analoghe.

Print | posted on martedì 28 aprile 2009 17:39 |

Feedback

Gravatar

# re: Schema-less Databases

Il problema di questo approccio è che poi non si possono "querare" i campi presenti nel blob.
A meno che poi non si estraggano i campi che devono essere ricercati
28/04/2009 18:28 | simone@piyosailing.com
Gravatar

# re: Schema-less Databases

> Questa idea è un'eventuale alternativa ai classici database relazionali, nel caso in cui ci si trovi in condizioni analoghe.

Quelle "condizioni" non derivano dal database relazionale di per se', che non ha nessun problema ne' di scalabilita' ne' di altro. Quello che non scala qui sono proprio le loro architetture basate su domain-model pesante.

-LV
28/04/2009 18:59 | LudovicoVan
Gravatar

# re: Schema-less Databases

Boh, a me pare che questa assurda scelta sia semplicemente figlia del fatto che MySQL *non* scala. Non i database server in generale, ma proprio *quel* database server.

Il fatto che per creare un indice venga lockata la tabella per ore mi sembra assurda, tutti i db che devono garantire funzionamenti 24x7 hanno la possibilità di ricreare gli indici online.
Giusto per darti un'idea su una tabella di dimensioni comparabili: ricreazione dell'indice su una tabella di 30.000.000 con cirica 300 transazioni/sec attive, con SQL Server 2005 ed una macchina media, è un'operazione che impiega meno di 20 minuti e che può essere fatta online (se hai la versione enterprise, certo)

Con questo disegno, inoltre, mi piacerebbe molto sapere che prestazioni hanno se devono fare delle ricerche all'interno della colonna "body". Ok, se questo non capita mai allora la soluzione è corretta, ma se capita hanno fatto una vaccata assurda.
29/04/2009 01:07 | Davide Mauri
Gravatar

# re: Schema-less Databases

x Davide:
Lo scopo del post è solamente quello di fornire nuove idee che in casi particolari potrebbero essere vincenti.
Per le richerche, da quello che ho capito, creano degli indici che nela pratica sono delle tabelle del tipo: valore -> entity guid
30/04/2009 01:24 | Antonio Ganci
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET