nosql - hackolade - Concepto de familia de columnas y modelo de datos.
nosql example (3)
Estoy investigando los diferentes tipos de tipos de base de datos NoSQL y estoy tratando de comprender el modelo de datos de las tiendas de la familia de columnas, como Bigtable, HBase y Cassandra.
Primer modelo
Algunas personas describen una familia de columnas como una colección de filas , donde cada fila contiene columnas [ 1 ], [ 2 ] . Un ejemplo de este modelo (las familias de columnas están en mayúsculas):
{
"USER":
{
"codinghorror": { "name": "Jeff", "blog": "http://codinghorror.com/" },
"jonskeet": { "name": "Jon Skeet", "email": "[email protected]" }
},
"BOOKMARK":
{
"codinghorror":
{
"http://codinghorror.com/": "My awesome blog",
"http://unicorns.com/": "Weaponized ponies"
},
"jonskeet":
{
"http://msmvps.com/blogs/jon_skeet/": "Coding Blog",
"http://manning.com/skeet2/": "C# in Depth, Second Edition"
}
}
}
Segundo modelo
Otros sitios describen una familia de columnas como un grupo de columnas relacionadas dentro de una fila [ 3 ], [ 4 ] . Datos del ejemplo anterior, modelados de esta manera:
{
"codinghorror":
{
"USER": { "name": "Jeff", "blog": "http://codinghorror.com/" },
"BOOKMARK":
{
"http://codinghorror.com/": "My awesome blog",
"http://unicorns.com/": "Weaponized ponies"
}
},
"jonskeet":
{
"USER": { "name": "Jon Skeet", "email": "[email protected]" },
"BOOKMARK":
{
"http://msmvps.com/blogs/jon_skeet/": "Coding Blog",
"http://manning.com/skeet2/": "C# in Depth, Second Edition"
}
}
}
Una posible razón detrás del primer modelo es que no todas las familias de columnas tienen una relación como la de USER
y BOOKMARK
. Esto implica que no todas las familias de columnas contienen claves idénticas. Colocar las familias de columnas en el nivel exterior se siente más natural desde este punto de vista.
El nombre ''familia de columnas'' implica un grupo de columnas. Así es exactamente cómo se presentan las familias de columnas en el segundo modelo .
Ambos modelos son representaciones válidas de los datos. Me doy cuenta de que estas representaciones son únicamente para comunicar los datos a los humanos; Las aplicaciones no "piensan" los datos de esa manera.
Pregunta
¿Cuál es la definición ''estándar'' de una familia de columnas? ¿Es una colección de filas o un grupo de columnas relacionadas dentro de una fila?
Tengo que escribir un artículo sobre el tema, por lo que también me interesa cómo las personas suelen explicar el concepto de "familia de columnas" a otras personas. Ambos modelos parecen contradecirse entre sí. Me gustaría usar el modelo ''correcto'' o generalmente aceptado para describir las tiendas de la familia de columnas.
Actualizar
Me conformé con el segundo modelo para explicar el modelo de datos en mi artículo. Todavía estoy interesado en cómo explica el modelo de datos de las tiendas de la familia de columnas a otras personas.
La base de datos de Cassandra sigue tu primer modelo, creo. Una familia de columnas es una colección de filas, que puede contener cualquier columna, de manera dispersa (por lo que cada fila puede tener una colección diferente de nombres de columnas, si se desea). El número de columnas permitidas en una fila es casi ilimitado (2 billones en Cassandra v0.7).
Un punto clave es que las claves de las filas deben ser únicas dentro de una familia de columnas, por definición, pero se pueden reutilizar en otras familias de columnas. Por lo tanto, puede almacenar datos no relacionados sobre la misma clave en diferentes ColumnFamilies.
En Cassandra, esto es importante porque los datos de una familia de columnas en particular se almacenan en los mismos archivos en el disco, por lo que es más eficiente colocar los elementos de datos que probablemente se recuperarán juntos, en la misma familia de columnas. Esto es en parte una cuestión de velocidad práctica, pero también es una cuestión de organizar sus datos en un esquema claro. Esto se refiere a su segunda definición: uno podría considerar que todos los datos sobre una clave en particular son una "fila", pero divididos por la Familia de columnas. Sin embargo, en Cassandra no es realmente una sola fila, porque los datos en una ColumnFamily se pueden cambiar independientemente de los datos en otras ColumnFamilies para la misma clave de fila.
Los dos modelos que has descrito son los mismos.
Familia de columnas es:
Key -> Key -> (Set of key/value pairs)
Conceptualmente se convierte en:
Table -> Row -> (Column1/Value1, Column2/Value2, ...)
Piense en ello como un mapa de mapa de pares clave / valor.
UserProfile = {
Cassandra = [emailAddress:"[email protected]", age:20],
TerryCho = [emailAddress:"[email protected]", gender:"male"],
Cath = [emailAddress:"[email protected]", age:20, gender:"female", address:"Seoul"],
}
Lo anterior es un ejemplo de una familia de columnas. Si tuvieras que tabularlo, obtendrías una tabla llamada UserProfile que parece:
UserName | Email | Age | Gender | Address
Cassandra | [email protected] | 20 | null | null
TerryCho | [email protected] | null | male | null
Cath | [email protected] | 20 | female | Seoul
La parte confusa es que realmente no hay una columna o una fila como estamos acostumbrados a pensar en ellos. Hay un montón de "familias de columnas" que se consultan por nombre (la clave). Esas familias contienen un conjunto de conjuntos de pares clave / valor, que también se consultan por nombre (la clave de fila), y finalmente, cada valor en el conjunto también se puede buscar por nombre (la clave de columna).
Si necesita un punto de referencia tabular, las "familias de columnas" serían sus "tablas". Cada "conjunto de pares k / v" dentro de ellos serían sus "filas". Cada "par del conjunto" sería los "nombres de columna y sus valores".
Internamente, los datos dentro de cada columna familly se almacenarán juntos, y se almacenarán de manera tal que las filas estén una detrás de la otra, y en cada fila, las columnas están una después de la otra. Entonces obtienes row1 -> col1/val1, col2/val2, ... , row2 -> col1/val1 ... , ... -> ...
Entonces, en ese sentido, los datos se almacenan mucho más como un almacén de filas, y menos como un almacén de columnas.
Para terminar, la elección de palabras aquí es simplemente desafortunada y engañosa. Las columnas en las familias de columnas deberían haber sido llamadas atributos. Las filas deberían haber sido llamadas Conjuntos de atributos. Las familias de columnas deberían haber sido denominadas familias de atributos. La relación con el vocabulario tabular clásico es débil y engañosa, ya que en realidad es bastante diferente.
Según mi entendimiento, Cassandra ColumnFamily no es una colección de filas, sino un grupo de columnas. Las columnas se agrupan según la clave de agrupación. por ejemplo, consideremos a continuación la familia de columnas:
CREATE TABLE store (
enrollmentId int,
roleId int,
name text,
age int,
occupation text,
resume blob,
PRIMARY KEY ((enrollmentId, roleId), name)
) ;
INSERT INTO store (enrollmentid, roleid, name, age, occupation, resume)
values (10293483, 01, ''John Smith'', 26, ''Teacher'', 0x7b22494d4549);
Fetched insertó los detalles anteriores mediante el uso de cassandra-cli, está bastante bien agrupado según la clave de agrupamiento, en este ejemplo "nombre = John Smith" es la clave de agrupamiento.
RowKey: 10293483:1
=> (name=John Smith:, value=, timestamp=1415104618399000)
=> (name=John Smith:age, value=0000001a, timestamp=1415104618399000)
=> (name=John Smith:occupation, value=54656163686572, timestamp=1415104618399000)
=> (name=John Smith:resume, value=7b22494d4549, timestamp=1415104618399000)