2008-12-17 17 views
11

supposer que je ce tableau RDBM (Entity-attribute-value_model):comment concevoir le schéma Hbase?

col1: entityID 
col2: attributeName 
col3: value 

et je veux utiliser HBase en raison de problèmes d'échelle.

Je sais que la seule façon d'accéder à la table Hbase est d'utiliser une clé primaire (curseur). Vous pouvez obtenir un curseur pour une clé spécifique et parcourir les lignes une à une.

Le problème est que, dans mon cas, je veux pouvoir itérer sur les 3 colonnes. par exemple:

  • pour un donné un entityID je veux obtenir tous ses attriutes et les valeurs
  • pour donner attributeName et de la valeur que je veux tous les entitiIDS ...

si une idée que j'ai eu est de construire une table Hbase qui contiendra les données (table DATA, avec entityID comme index primaire), et 2 tables "index" une avec attributeName comme clé primaire, et l'autre avec valeur

chaque onglet d'index le tiendra une liste de pointeurs (entityIDs) pour la table DATA.

Est-ce une approche raisonnable? ou est un abus des concepts Hbase?

Dans ce blog le author disent:

HBase permet obtenir des opérations de clé primaire et des analyses (pensez: curseur) sur la ligne plages. (Si vous avez à la fois l'échelle et besoin d'indices secondaires, ne vous inquiétez pas - Lucene à la rescousse Mais c'est un autre poste!.)

Savez-vous comment Lucene peut vous aider?

- Yonatan

Répondre

5

index secondaires serait en effet utile pour de nombreuses applications potentielles de HBase, et je crois que les développeurs sont en fait regarder. Commander http://www.mail-archive.com/[email protected]/msg04801.html.

Dans le même temps cependant, si votre stockage de données d'application peut être modélisé comme un schéma en étoile (voir http://en.wikipedia.org/wiki/Star_schema), vous pouvez vous à la caisse la solution qui Hypertable propose pour le secondaire indice de type a besoin http://markmail.org/message/rphm4q6cbar2ycgp

0

Je recommande d'avoir deux tables plates différentes: une pour rechercher les attributs + les valeurs données entityID, et une pour rechercher les attributs donnés + entityID.

Tableau 1 ressemblerait à ceci:

entityID1 { 
    attribute1: value1; 
    attribute2: value2; 
    ... 
} 

et Tableau 2:

attribute1_value1 { 
    entityID1; 
} 
attribute2_value2 { 
    entityID1; 
} 
Questions connexes