加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

erlang – 帮我了解mnesia(NoSQL)建模

发布时间:2020-12-13 13:31:24 所属栏目:百科 来源:网络整理
导读:在我追求理解Mnesia的任务中,我仍然在思考关系方面奋斗.所以我会把我的斗争放在这里,并要求最好的解决方法. 一到多对多关系 说我有一堆人, -record(contact,{name,phone}). 现在,我知道我可以定义手机一直被保存为一个列表,所以人们可以有多个电话号码,我想
在我追求理解Mnesia的任务中,我仍然在思考关系方面奋斗.所以我会把我的斗争放在这里,并要求最好的解决方法.

一到多对多关系
说我有一堆人,

-record(contact,{name,phone}).

现在,我知道我可以定义手机一直被保存为一个列表,所以人们可以有多个电话号码,我想这是做的方式(是吗?说,找一个号码呢?).

多到多对多关系
现在让我们假设我有多个团体,我可以把人们放在一起.团体名称没有任何意义,他们只是名字;这个概念是“unix系统组”或“标签”.天真地,我会把这个会员模范为一个proplist,像

{groups [{friends,bool()},{family,{work,bool()}]} %% and so on...

例如,作为来自上述的“联系人”记录中的领域.如果我想能够快速地查找基于组名称的所有成员,并且还希望能够查找个人注册的所有组,那么在mnesia内建模的最佳方式是什么?当然,我也可以将其建模成一个只包含组标识符的列表.为了与mnesia一起使用,最好的模式是什么?

如果这个问题是愚蠢的话,我很抱歉.有很多关于mnesia的文档,但是缺乏(IMO)一些很好的例子可供整体使用.

对于第一个例子,考虑这个记录:
-record(contact,[phonenumber,phonenumber,...]}).

联系人是具有两个字段,名称和电话的记录,其中电话是电话号码列表.如user425720所示,如果您对小存储空间有极高的要求,那么将其存储为字符串以外的其他内容可能是有意义的.

现在这里是很难“获取”键值存储的部分:您还需要存储反向关系.换句话说,你需要类似于以下内容:

-record(phone,{phonenumber,contactname}).

如果您的应用程序中有一个图层来抽取数据库处理,则可以在添加/更改联系人时始终添加/更改电话记录.

对于第二个例子,考虑这两个记录:

-record(contact,{uuid,name,[group_id,group_id]}).
-record(group,[contact_id,contact_id]}).

最简单的方法是只存储指向相关记录的ids.由于Mnesia没有引用完整性的概念,如果您删除组而不从所有用户中删除该组,则可能会失去同步性.

如果您需要在联系人记录上存储组的类型,可以使用以下内容:

-record(contact,[{family,group_id]},[..]}]}).

您的第二个问题也可以通过使用中间记录来解决,您可以将其视为“会员资格”.

-record(contact,...}).
-record(group,...}).
-record(membership,{contact_uuid,group_uuid}). # must use 'bag' table type

可以有任何数量的“会员”记录.每个用户组将有一条记录.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读