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

在我追求理解Mnesia的任务中,我仍然在思考关系方面奋斗.所以我会把我的斗争放在这里,并要求最好的解决方法.

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

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

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

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

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

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

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

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

-record(contact, {name, [phonenumber, phonenumber, ...]}).

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

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

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

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

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

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

最简单的方法是只存储指向相关记录的ids.由于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

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

相关文章
相关标签/搜索