CON*_*GHT 12 erlang mnesia nosql
在我理解Mnesia的过程中,我仍然在用关系术语思考.因此,我将把我的斗争放在这里,并寻求解决它们的最佳方法.
一对多关系 说我有一群人,
-record(contact, {name, phone}).
Run Code Online (Sandbox Code Playgroud)
现在,我知道我可以将手机定义为总是保存为列表,因此人们可以拥有多个电话号码,我想这是做到这一点的方式(是吗?我怎么会这样看,反过来,比如,找一个数字的名字?).
多对多关系 现在让我们假设我有多个团体可以让人们进去.团体名称没有任何意义,它们只是名字; 这个概念是"unix系统组"或"标签".天真的,我会把这个会员资格建模为一个支持者,比如
{groups [{friends, bool()}, {family, bool()}, {work, bool()}]} %% and so on...
Run Code Online (Sandbox Code Playgroud)
例如,作为上面"联系"记录中的字段.如果我希望能够快速查找基于组名的组中的所有成员,并且还希望能够查找个人注册的所有组,那么在mnesia中对此进行建模的最佳方法是什么?当然,我也可以将其建模为仅包含组标识符的列表.与mnesia一起使用时,对此进行建模的最佳方法是什么?
如果这个问题愚蠢,我道歉.关于mnesia的文档很多,但它缺乏(IMO)一些很好的整体使用示例.
对于第一个示例,请考虑以下记录:
-record(contact, {name, [phonenumber, phonenumber, ...]}).
Run Code Online (Sandbox Code Playgroud)
contact
是具有两个字段的记录,name
其中phone
电话是电话号码列表。正如 user425720 所说,例如,如果您对小存储空间有极端要求,那么将它们存储为字符串以外的其他内容可能是有意义的。
现在,关键值存储很难“得到”的部分是:您还需要存储逆关系。换句话说,您需要类似于以下内容的内容:
-record(phone, {phonenumber, contactname}).
Run Code Online (Sandbox Code Playgroud)
如果您的应用程序中有一个层来抽象数据库处理,则可以使其在添加/更改联系人时始终添加/更改电话记录。
--
对于第二个示例,请考虑这两条记录:
-record(contact, {uuid, name, [group_id, group_id]}).
-record(group, {uuid, name, [contact_id, contact_id]}).
Run Code Online (Sandbox Code Playgroud)
最简单的方法是只存储指向相关记录的 id。由于 Mnesia 没有引用完整性的概念,因此如果您删除一个组而不从所有用户中删除该组,则可能会变得不同步。
如果您需要在联系人记录中存储组类型,您可以使用以下命令:
-record(contact, {name, [{family, [group_id, group_id]}, {work, [..]}]}).
Run Code Online (Sandbox Code Playgroud)
--
您的第二个问题也可以通过使用中间记录来解决,您可以将其视为“成员身份”。
-record(contact, {uuid, name, ...}).
-record(group, {uuid, name, ...}).
-record(membership, {contact_uuid, group_uuid}). # must use 'bag' table type
Run Code Online (Sandbox Code Playgroud)
可以有任意数量的“成员资格”记录。每个用户组都会有一条记录。
归档时间: |
|
查看次数: |
1216 次 |
最近记录: |