Создайте несколько таблиц Mnesia с одинаковыми столбцами - PullRequest
3 голосов
/ 25 июля 2011

Я хочу создать следующую схему в Mnesia. Иметь три таблицы с именами t1, t2 и t3, в каждой из которых хранятся элементы следующей записи:

-record(pe, {pid, event}).

Я попытался создать таблицы с:

Attrs = record_info(fields, pe),
Tbls = [t1, t2, t3],
[mnesia:create_table(Tbl, [{attributes, Attrs}]) || Tbl <- Tbls],

, а затем напишите некоторый контент, используя следующую строку (P и E имеют значения):

mnesia:write(t1, #pe{pid=P, event=E}, write)

но я получил ошибку неверного типа. (Соответствующие команды были переданы транзакциям, так что это не проблема синхронизации.)

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

1 Ответ

1 голос
/ 25 июля 2011

относительно вашего "DDT" для создания таблиц, я не вижу никакой загадки на первый взгляд, просто помните, что использование таблиц с именами, отличными от имен записей, приводит к потере "простых" команд (таких как mnesia: write /1) потому что они используют элемент (1, RecordTuple) для получения имени таблицы.

При определении таблиц вы можете использовать параметр {record_name, RecordName} (в вашем случае: {record_name, pe}), чтобы сообщить mnesia, чтопервый атом в кортеже, представляющий записи в таблице, - это не имя таблицы, а атом, который вы передали с помощью record_name;так что в случае вашей таблицы t1 она делает mnesia ожидающей 'pe' записей при вставке или поиске записей.

Если вы хотите вставить запись во все таблицы, вы можете использовать скрипт, похожий на тот, который использовалсясоздать таблицу (но в оболочке функции для контекста транзакции mnesia):

insert_record_in_all_tables(Pid, Event, Tables) ->
    mnesia:transaction(fun() -> [mnesia:write(T, #pe{pid=Pid, event=Event}, write) ||  T <- Tables] end).

Надеюсь, это поможет!

...