>>>Допустим взаимосвязь таблиц через ключи я обеспечу собственными силами, а вот как быть с выборкой по одному из десятка полей в одной таблицы? Ведь таблица всё равно остаётся "двухпольной" ключ->значение? как вариант в поле "значение" компресить десяток полей и каждый раз при выборке по одному из них проходить по всем записям в базе, получать "значение" разбивать его на поля и смотреть нужное?
>>>Или я что-то не так понял?
>>
>>BDB поддерживает вторичные индексы. Вот:
>>http://www.oracle.com/technology/documentation/berkeley-db/db/gsg/C/indexes.html
>Это аналогично join в SQL? Я правильно понял?неправильно, но ссылка указана на правильную главу. У меня даже есть API под Python, обеспечивающий через py-bdb примитивные функции вставки и выборки таблицы со вторичными ключами с удобным интерфейсом. Правда быстродейственность на большом количестве ключей сильно страдает из-за проблем с быстродействием самого интерпретатора.
>Если да, то это меня не сильно интересовало. Сейчас ооочень хотелось б
>знать как реализовать в BDB следующую таблицу:
>ID DATE IP VER ....
>
>пока вижу только следующий вариант:
>"ID"->"DATE|IP|VER|...."
>ключ->значение
Теперь представь, что associate позволяет тебе привязать callback функцию, которая выбирает IP + DATE из приведеного примера в качестве вторичного ключа. На каждый ключ надо будет делать по одной callback функции. Повторюсь как это работает: при вставке BDB, если зарегестированны вторичные индексы, BDB автоматически для них вызывавет callback функцию, которая принимает всю строку целиком. В нашем случае, это - "DATE|IP|VER|....". Из неё выделяется составная строка, говоря на perl/php наречии:
return serialize($IP).serialize($DATE);
Получив составленный на основе всей записи составной ключ (не обязательно ключ должен быть составным), происходит прозрачная вставка во вторичный индекс указателя на эту запись. BDB также обеспечивает целостность данных.
В этом смысле BDB представляет большую свободу, чем реляционные таблицы. Так например, я могу составить индекс динамически расчитаным данным, что на SQL логично, но невозможно выразить, как:
CREATE TABLE modular_10 (
id INT NOT NULL,
value BLOB NOT NULL,
PRIMARY KEY (id),
KEY (MOD(id, 10))
);
P.S. Подобным образом устроена работа и в mysql. Принцип работы всех реляционных баз данных один и тот же. Что для и тебя видится реляционной таблицей, по сути является множеством таблиц - (ключ, единственное значение). Правда за счет того, что в виде значения используется указатель на запись, на основании которой расчитано значение ключа, накладные расходы на хранение избыточной информации не сильно завышены.
P.P.S. Специально написал много, а также сбивался и повторялся :)