как построить один-много рядов в токийском кабинете? - PullRequest
2 голосов
/ 04 августа 2009

Я цитирую документацию кабинета Токио ...

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

или tokyocabinet позволяет использовать ключи на основе кортежей?

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

~ В

Ответы [ 2 ]

1 голос
/ 23 августа 2009

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

Вот пример использования низкоуровневого интерфейса Pyrant :

>>> 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» в Спецификации API Tokyo Cabinet ).

Обратите внимание, что и "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',
}

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

Если вы используете базу данных TC другого типа (не TDB), я не могу представить правильное решение. Вы можете задать этот вопрос в соответствующей дискуссионной группе .

0 голосов
/ 02 июня 2010

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

В базах данных Токийского Кабинета B + допускаются дубликаты ключей:

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
...