2008-12-17 18 views
11

nehme an, dass ich diese RDBM Tisch (Entity-attribute-value_model):Wie Hbase-Schema entwerfen?

col1: entityID 
col2: attributeName 
col3: value 

und ich möchte HBase aufgrund Skalierungsfragen verwenden.

Ich weiß, dass die einzige Möglichkeit, auf Hbase-Tabelle zuzugreifen, die Verwendung eines Primärschlüssels (Cursor) ist. Sie können einen Cursor für einen bestimmten Schlüssel abrufen und die Zeilen nacheinander durchlaufen.

Das Problem ist, dass ich in meinem Fall in der Lage sein soll, auf alle 3 Spalten zu iterieren. zum Beispiel:

  • für eine gegebene einem entityID Ich möchte seine attriutes alle Werte und
  • für Give attribute und Wert ich auf alle entitiIDS ...

wollen bekommen, so Eine Idee, die ich hatte, ist, eine Hbase-Tabelle zu erstellen, die die Daten enthält (Tabelle DATA, mit EntityID als Primärindex) und 2 "Index" -Tabellen eine mit attributeName als Primärschlüssel und die andere mit Wert

jede Indexregisterkarte le enthält eine Liste von Zeigern (entityIDs) für die DATA-Tabelle.

Ist es ein vernünftiger Ansatz? oder ist es ein "Missbrauch" der Hbase-Konzepte?

In dieser blog die author sagen:

HBase ermöglicht Operationen durch primäre Schlüssel und Scans (man denke: Cursor) verwinden Reihe Bereiche. (Wenn Sie sowohl Umfang und Notwendigkeit von Sekundärindizes haben, keine Sorge - Lucene zur Rettung Aber das ist eine andere Pfosten.)

Wissen Sie, wie Lucene helfen kann?

- Yonatan

Antwort

5

Sekundärindizes wäre in der Tat für viele potentielle Anwendungen von HBase nützlich sein, und ich glaube, dass die Entwickler in der Tat sind es zu betrachten. Zur Kasse gehen http://www.mail-archive.com/[email protected]/msg04801.html. obwohl

In der Zwischenzeit, wenn Ihre Anwendung der Datenspeicherung als Sternschema modelliert werden kann (siehe http://en.wikipedia.org/wiki/Star_schema) Sie können gerne die Lösung zur Kasse, die Hypertable für Sekundärindex-Typen schlägt braucht http://markmail.org/message/rphm4q6cbar2ycgp

0

Ich empfehle mit zwei verschiedene flache Tabellen: eine für das Nachschlagen von Attributen + Werten mit der EntityID und eine für das Nachschlagen der EntityID mit Attributen + Werten.

Tabelle 1 würde wie folgt aussehen:

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

und Tabelle 2:

attribute1_value1 { 
    entityID1; 
} 
attribute2_value2 { 
    entityID1; 
}