我最近一直潜入Erlang,我决定使用Mnesia做我的数据库工作,因为它可以存储任何种类的Erlang数据结构,没有问题,轻松扩展,与列表推导一起使用.
来自标准sql数据库,大多数行可以并且应该由主键标识,通常是自动递增整数.默认情况下,Mnesia将一行的第一个字段视为其关键字.它也没有办法有一个自动递增的整数密钥,据我所知.
鉴于我有这些虚构的记录代表我的表:
-record(user,{name,salt,pass_hash,email}). -record(entry,{title,body,slug}). -record(user_entry,{user_name,entry_title}).
我使用用户名可能对某些目的来说可以是足够好的,与入门标题一样,为了识别资源,但是如何保持诚信?
说用户更改其名称,或者条目的标题在编辑后更改.如何确保我的数据仍然正确相关?使用用户名更新每个表,当它的变化听起来像一个可怕的想法,无论如何被放置.
在Mnesia中实现某种主要关键系统的最佳方法是什么?
而且,如果第一个字段通常是密钥,那么像“user_entry”这样的中介表怎么办?否则,在Mnesia中代表多对多的关系会有什么更好的办法?
解决方法
我更喜欢使用GUID而不是自动递增int作为人造外键.有一个
Erlang uuid module可用
或者您可以使用{now(),node()},因为现在/ 0 doc说:“还可以保证对此BIF的后续调用会不断增加值.
或者您可以使用{now(),node()},因为现在/ 0 doc说:“还可以保证对此BIF的后续调用会不断增加值.
使用可以改变的东西,作为主键似乎是一个独立于数据库系统的坏主意.
不要忘记,即使以第一种正常形式,您也不需要在Mnesia中规范化数据;在你的例子中,我将考虑以下结构:
-record(user,{id,name,email,entries}). -record(entry,title,slug,users}).
编辑:固定为多对多,而不是多对一.