在我追求理解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