2009-08-04 1 views
2

я процитирую документы кабинета Токио ...Как построить один-много строк в шкафу tokyo?

Что касается базы данных хеш-таблицы, каждый ключ должен быть уникальным в пределах базы данных, поэтому нельзя хранить два или более записей с ключом наложений.

или делает tokyocabinet разрешать кортежные ключи?

, что было бы лучшим способом установить один-ко-многим магазин (как на гусеничном 1 кВт < -> много docids)

~ B

ответ

1

Использование базы данных таблицы (TDB), вам может просто хранить список ключей в одном значении в качестве токенов. Пока ваши ключи являются действительными «токенами», вы можете легко перечислить их таким образом в одном поле.

Ниже приведен пример с использованием Pyrant «s низкоуровневого интерфейса:

>>> 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 является типом операции, которая выступает за„строка содержит, по меньшей мере, один маркер в ...“(смотрите„tctdbqryaddcond“в Tokyo Cabinet API specs).

Обратите внимание, что оба слова «abc, def» и «abc def» соответствовали ключевому слову «abc», но «abcdef» этого не делал, несмотря на то, что «abc» на самом деле является подмножеством «abcdef». Это может быть использовано для поиска ключей, хранящихся в одной строке, например:

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', 
} 

(Метки, вероятно, не лучший пример, поскольку они не должны быть ссылки.)

Если вы используете База данных ТС другого типа (а не TDB), я не могу представить правильное решение. Вы можете задать этот вопрос в соответствующем discussion group.

0

Что касается базы данных хеш-таблицы, каждый ключ должен быть уникальным в базе данных, поэтому невозможно хранить две или более записей с перекрытием клавиш.

B + -tree базы данных Tokyo Cabinet позволяет дубликаты ключей:

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

Использование Ruby, API:

TokyoCabinet::BDB.putdup(key, value) -> true|false 
TokyoCabinet::BDB.getlist(key) => [value, ...]|nil 
Смежные вопросы