È molto semplice, forse più semplice di quanto ci si aspetti.
Quando si archivia un'entità blog, si intende inserire nella tabella delle entità principali, ovviamente. Un blog è simile al seguente:
CREATE TABLE entities (
id INT AUTO_INCREMENT PRIMARY KEY,
entity_json TEXT NOT NULL
);
INSERT INTO entities (id, entity_json) VALUES (DEFAULT,
'{userid: 8675309,
post_date: "2010-07-27",
title: "MySQL is NoSQL",
body: ... }'
);
Si inserisce anche in una tabella di indice separata per ciascun tipo logico di attributo. Usando il tuo esempio, l'ID utente per un blog non è lo stesso di un ID utente per un tweet. Dal momento che appena inserito un blog, è quindi inserire nella tabella indice (s) per l'attributo blog (s):
CREATE TABLE blog_userid (
id INT NOT NULL PRIMARY KEY,
userid BIGINT UNSIGNED,
KEY (userid, id)
);
INSERT INTO blog_userid (id, userid) VALUES (LAST_INSERT_ID(), 8675309);
CREATE TABLE blog_date (
id INT NOT NULL PRIMARY KEY,
post_date DATETIME UNSIGNED,
KEY (post_date, id)
);
INSERT INTO blog_date (id, post_date) VALUES (LAST_INSERT_ID(), '2010-07-27');
Non inserire in tutte le tabelle di indice Tweet, perché hai appena creato un blog, non un tweet .
Conoscete tutte le righe nei blog di riferimento blog_userid
, perché è così che li avete inseriti. Così si può cercare per i blog di un dato utente:
SELECT e.*
FROM blog_userid u JOIN entities e ON u.id = e.id
WHERE u.userid = 86765309;
Re tuo commento:
Sì, è possibile aggiungere colonne reali alla tabella enti per gli attributi che si sa si applicano a tutti i contenuti tipi. Per esempio:
CREATE TABLE entities (
id INT AUTO_INCREMENT PRIMARY KEY,
entity_type INT NOT NULL,
creation_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
entity_json TEXT NOT NULL
);
Le colonne per entity_type e creation_date permetterebbe di strisciare le entità in ordine cronologico (o invertire ordine cronologico) e sapere quale serie di tabelle di indice corrisponde al tipo di entità di una data riga.
si consiglia per guardare [database dei documenti] (http://en.wikipedia.org/wiki/Document-oriented_database). Questi ti consentono anche di archiviare interi documenti, proprio come fa FriendFeed, ma il database si occupa di tutte le indicizzazioni per te. –