2009-08-04 12 views
2

i aus dem Schrank docs tokyo zitieren ...Wie baut man im Tokyo-Schrank eine oder mehrere Reihen?

Wie für Datenbank-Hash-Tabelle, muss jeder Schlüssel in einer Datenbank eindeutig sein, so ist es unmöglich, zwei zu speichern oder mehr Datensätze mit einem Schlüssel Überlappungen.

oder kann tokyocabinet Tupel-basierte Schlüssel verwenden?

was wäre der beste Weg, um eine Eins-zu-viele Speicher (wie ein Raupen 1 kw < -> viele DocIDs) setzen

~ B

Antwort

1

Mit Hilfe der Tabelle Datenbank (TDB), Sie kann einfach eine Liste von Schlüsseln in einem Wert als Token speichern. Solange Ihre Schlüssel gültige "Tokens" sind, können Sie sie auf einfache Weise in einem einzigen Feld auflisten.

Hier ist ein Beispiel unter Verwendung von Pyrant ‚s Low-Level-Schnittstelle:

>>> from pyrant import Tyrant 
>>> t = Tyrant() 
>>> includes = 5 # code for operation TDBQCSTROR 
>>> t['test'] = {'foo': 'abc,def', 'bar': 'abc def', 'quux': 'abcdef'} 
>>> t.proto.search([('foo',includes,'abc')]) 
[u'test'] 
>>> t.proto.search([('bar',includes,'abc')]) 
[u'test'] 
>>> t.proto.search([('quux',includes,'abc')]) 
[] 
>>> t.proto.search([('quux',includes,'abcd')]) 
[] 
>>> t.proto.search([('quux',includes,'abcdef')]) 
[u'test'] 

TDBQCSTROR ist ein Operationstyp das steht für "string umfasst mindestens ein Token in ..."(siehe "tctdbqryaddcond" in Tokyo Cabinet API specs).

Beachten Sie, dass sowohl "abc, def" und "abc def" dem Schlüsselwort "abc" entsprachen, aber "abcdef" nicht, obwohl "abc" tatsächlich Teilmenge von "abcdef" ist. Dies kann verwendet werden Schlüssel in einem einzigen String gespeichert suchen, zB:

t['tokyocabinet'] = {'title': 'Tokyo Cabinet'} 
t['primary-key'] = {'title': 'Primary Key'} 
t['question1228313'] = { 
    'title': 'how to build one to many rows in tokyo cabinet?', 
    'tags': 'tokyocabinet, primary-key', 
} 

(Stichworte sind wahrscheinlich nicht das beste Beispiel, wie sie benötigen keine Verweise sein.)

Wenn Sie ein verwenden TC-Datenbank anderer Art (nicht TDB), ich kann mir keine gültige Lösung vorstellen. Sie können diese Frage in der verwandten discussion group stellen.

0

Wie für die Datenbank der Hashtabelle muss jeder Schlüssel in einer Datenbank eindeutig sein, so dass es nicht möglich ist, zwei oder mehr Datensätze mit einer Schlüsselüberlappung zu speichern.

B + -Baum Tokyo Cabinet Datenbanken erlauben doppelte Schlüssel:

bool tcbdbputdup(TCBDB *bdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz); 

die API Ruby-Anwendung:

TokyoCabinet::BDB.putdup(key, value) -> true|false 
TokyoCabinet::BDB.getlist(key) => [value, ...]|nil