2010-07-28 10 views
5

Bret Taylor discutieron el diseño sin esquema en esta entrada del blog: http://bret.appspot.com/entry/how-friendfeed-uses-mysqlLas preguntas acerca de FriendFeed MySql sin esquema Diseño

Parece que almacenan objetos diferentes de la clase en una sola table.Then construir más tablas de índice.

mi pregunta es cómo construir índice en una clase.

por ejemplo, el blog de un usuario es {id, userid, title, body}. El tweet de un usuario es {id, userid, tweet}.

Si quiero construir un índice para los blogs de los usuarios ¿cómo puedo hacer?

+0

es posible que desee para ver [bases de datos de documentos] (http://en.wikipedia.org/wiki/Document-oriented_database). Estos también le permiten almacenar documentos completos, al igual que FriendFeed, pero la base de datos se ocupa de todos los índices por usted. –

Respuesta

10

Es muy simple, quizás más simple de lo que esperaba.

Cuando almacena una entidad de blog, se va a insertar en la tabla de entidades principales, por supuesto. Un blog es la siguiente:

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: ... }' 
); 

También inserción en una tabla índice separado para cada tipo de atributo lógico. Usando su ejemplo, el ID de usuario para un blog no es lo mismo que un ID de usuario para un tweet. Dado que acaba de insertar un blog, a continuación, inserta en la tabla (s) de índice para el blog atributo (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'); 

No inserte en las tablas de índice pío, ya que acaba de crear un blog, no un tweet .

Conoce todas las filas en los blogs de referencia blog_userid, porque así es como las insertó. Así que usted puede buscar blogs de un usuario determinado:

SELECT e.* 
FROM blog_userid u JOIN entities e ON u.id = e.id 
WHERE u.userid = 86765309; 

Re tu comentario:

Sí, se puede añadir columnas reales a la mesa de entidades de cualquier atributo que sabe que se aplica a todos los contenidos tipos. Por ejemplo:

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 
); 

Las columnas para entity_type y creation_date le permitiría arrastran las entidades en orden cronológico (o cronológico inverso) y saber qué conjunto de tablas de índice coincide con el tipo de entidad de una fila determinada.

+0

Pero de acuerdo con el artículo. a veces pueden rastrear la tabla de entidades para crear un nuevo índice o modificar el índice anterior. Creo que puede agregar un nuevo "valor" clave-tipo: "blog" o "tipo": "twittear" en el blob.¿Hay alguna sugerencia mejor? – user404017

0

No almacenan objetos de diferentes clases en la misma tabla. La tabla de 'entidades' a la que se refieren se usa para almacenar solo un tipo de entidades.

Por ejemplo, una entidad típica en FriendFeed podría tener este aspecto:

"id": "71f0c4d2291844cca2df6f486e96e37c", 
"user_id": "f48b0440ca0c4f66991c4d5f6a078eaf", 
"feed_id": "f48b0440ca0c4f66991c4d5f6a078eaf", 
"title": "We just launched a new backend system for FriendFeed!", 
"link": "http://friendfeed.com/e/71f0c4d2-2918-44cc-a2df-6f486e96e37c", 
"published": 1235697046, 
"updated": 1235697046, 

Comprender la aplicación mejor, han dado aquí un vistazo al ejemplo: https://github.com/jamesgolick/friendly#readme

+0

Creo que eso es exactamente lo que hacen (almacenar objetos de diferentes tipos en la misma tabla). Si observa el enlace de la publicación original, dice 'nuestras entidades están almacenadas en una TABLA que se ve así ... entidades TABLE'. El contenido de la entidad del que das un ejemplo está contenido en el campo del cuerpo de la tabla de entidades. Creo que ese es el objetivo del diseño. ¿Me falta algo? – riley

+0

Sí, te estás perdiendo algo. Es un tipo de entidad. Usan el diseño sin esquema para que puedan agregar y eliminar columnas sin bloquear la tabla. Todas las entidades son iguales, con la excepción de las entidades que existían antes de agregar un campo, no tienen ese campo en particular en su JSON. –

Cuestiones relacionadas