erlang – 帮我了解mnesia(NoSQL)建模
在我追求理解Mnesia的任务中,我仍然在思考关系方面奋斗.所以我会把我的斗争放在这里,并要求最好的解决方法.
一到多对多关系 -record(contact,{name,phone}). 现在,我知道我可以定义手机一直被保存为一个列表,所以人们可以有多个电话号码,我想这是做的方式(是吗?说,找一个号码呢?). 多到多对多关系 {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 可以有任何数量的“会员”记录.每个用户组将有一条记录. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |