Для первого примера рассмотрим эту запись:
-record(contact, {name, [phonenumber, phonenumber, ...]}).
contact
- это запись с двумя полями, name
и phone
, где phone - список телефонных номеров.Как сказал user425720, может иметь смысл хранить их как что-то иное, чем строки, если у вас есть экстремальные требования, например, к небольшому объему хранилища.
Теперь вот часть, которую трудно «достать» с помощью ключа.хранилища значений: вам также необходимо хранить обратные отношения.Другими словами, вам нужно что-то похожее на следующее:
-record(phone, {phonenumber, contactname}).
Если в вашем приложении есть слой для абстрагирования от обработки базы данных, вы можете всегда добавлять / изменять записи телефона при добавлении / измененииконтакт.
-
Для второго примера рассмотрим эти две записи:
-record(contact, {uuid, name, [group_id, group_id]}).
-record(group, {uuid, name, [contact_id, contact_id]}).
Самый простой способ - просто сохранить идентификаторы, указывающие на связанные записи.Поскольку Mnesia не имеет понятия ссылочной целостности, это может стать несинхронизированным, если, например, вы удалите группу, не удаляя эту группу из всех пользователей.
Если вам нужно сохранить тип группы в записи контакта,Вы можете использовать следующее:
-record(contact, {name, [{family, [group_id, group_id]}, {work, [..]}]}).
-
Ваша вторая проблема также может быть решена с помощью промежуточной записи, которую вы можете рассматривать как «членство».
-record(contact, {uuid, name, ...}).
-record(group, {uuid, name, ...}).
-record(membership, {contact_uuid, group_uuid}). # must use 'bag' table type
Может быть любое количество записей "членства".Для каждой группы пользователей будет одна запись.