Недавно я погружался в Erlang, и я решил использовать Mnesia для выполнения моей работы с базой данных, поскольку он может хранить любую структуру данных Erlang без проблем, масштабировать с легкостью, использоваться со списком и т.д.
Исходя из стандартных баз данных SQL, большинство строк могут и должны быть идентифицированы с помощью первичного ключа, обычно с автоматическим добавочным целым. По умолчанию Mnesia считает, что первым полем строки является ее ключ. Насколько я знаю, он также не имеет возможности иметь автоматически увеличивающийся ключ.
Учитывая, что у меня есть эти вымышленные записи, представляющие мои таблицы:
-record(user, {name, salt, pass_hash, email}).
-record(entry, {title, body, slug}).
-record(user_entry, {user_name, entry_title}).
Я полагаю, что использование имени пользователя может быть достаточно хорошим для некоторых целей, как и для названия записи, для идентификации ресурса, но как я могу продолжать поддерживать целостность?
Скажите, что пользователь изменил свое имя или изменил название записи после редактирования. Как я могу убедиться, что мои данные все еще правильно связаны? Обновление каждой таблицы с использованием имени пользователя при ее изменении звучит как ужасная идея независимо от того, как она была помещена.
Какой был бы лучший способ внедрения какой-то системы первичных ключей в Mnesia?
Кроме того, как будет выглядеть таблица-посредник типа user_entry, если первое поле обычно является ключом? В противном случае лучше было бы представлять отношения "многие ко многим" в Mnesia?