Как создать и использовать (или моделировать) многоколоночные индексы в Erlang Mnesia - PullRequest
4 голосов
/ 29 декабря 2010

Я просмотрел документацию по Mnesia и 3 популярных книги по Erlang. Кажется, что могут быть созданы и использованы только первичные и вторичные индексы с одним столбцом. Или, может быть, это только то, что покрывают примеры? Если я создам отдельный индекс для каждого из столбцов, сможет ли Mnesia использовать их вместе для имитации поиска по ключевому индексу в нескольких столбцах? Если это так, будет ли производительность намного лучше, чем простое сканирование таблицы?

Если Mnesia не поддерживает многостолбцовую индексацию, учитывая, что для ее собственной базы данных кто-то моделировал эту функцию в Erlang.

Второй вопрос: как насчет имитации ограничений (ссылочных, проверочных), триггеров и уведомлений на основе событий?

Ответы [ 2 ]

5 голосов
/ 01 января 2011

Одним из способов является сохранение {X, Y} непосредственно в «столбце», в котором есть ключ. Это позволяет вам выполнять быстрый поиск по запросам структуры {_, _}, но также означает, что поиск будет медленнее, когда вы знаете только одно из значений в кортеже (по умолчанию таблицы являются хеш-таблицами).

Что касается других ваших потребностей в СУБД: Mnesia была создана не для того, чтобы заменить традиционные базы данных, а для удовлетворения потребностей разработчиков Ericsson при написании своих приложений. Таким образом, вам может быть лучше хранить данные в традиционной базе данных, если вы к этому стремитесь.

Однако вы можете добавить функциональность с помощью кода вокруг Mnesia - если вы этого хотите.

1 голос
/ 13 января 2011

Mnesia имеет уведомления о событиях. Возможно иметь процесс (gen_server), который подписывается на события mnesia. Эти события подразделяются на категории: события таблицы, системные события и другие. Прочитайте документацию mnesia в части, касающейся событий. Фактически процесс может сообщать о событиях с помощью обработчика событий mnesia, вызывая: mnesia:report_event(Event). Весь процесс, подписанный на события mnesia, получит это сообщение. Mnesia будет сообщать в режиме реального времени информацию обо всех транзакциях на столе подписанным процессам. Могут быть прочитаны, записаны или удалены транзакции, и процесс в его цикле может соответствовать типу события, в котором он может быть заинтересован. Существуют подробные и простые события таблицы. Я лично нашел события очень полезными. Вы должны быть в состоянии получить детали из документации.

О событиях. Теперь в таблицах mnesia хранятся записи того же типа. Доступ к этой информации можно получить, позвонив по номеру mnesia:table_info(Table_name::atom(),attributes). Применяя индексы к таблице мнезий, он будет принимать любое поле из этих атрибутов, если оно не является первым полем записи (обычно называемым «первичным ключом»). Эти индексы лучше применять при создании таблицы, чем во время выполнения из-за ряд причин. Рассмотрим фрагмент кода ниже

-record(employee,{id,first_name,other_name,sex,age,job}).

install(Nodes)->
  mnesia:create_schema(Nodes),
  mnesia:start(),
  mnesia:create_table(employee,[{index,[age,sex,first_name,job]},<br>   {attributes,record_info(fields,employee)}]),
  mnesia:stop(),
ok.

если я хорошо понял ваш вопрос, то теперь я могу сказать, что у сотрудника таблицы есть столбцы: индекс возраста, пола, имени, другого имени и задания, а также все API-интерфейсы mnesia для поиска записей на основе индексированных атрибутов, например, для работы. mnesia:index_read/3 or mnesia:index_match_object/2 or mnesia:index_match_object/4. удачи

/joshmuza@gmail.com

...