数据库 – 使用Mnesia保持关系完整性
发布时间:2020-12-12 08:39:53 所属栏目:MsSql教程 来源:网络整理
导读:我最近一直潜入Erlang,我决定使用Mnesia做我的数据库工作,因为它可以存储任何种类的Erlang数据结构,没有问题,轻松扩展,与列表推导一起使用. 来自标准SQL数据库,大多数行可以并且应该由主键标识,通常是自动递增整数.默认情况下,Mnesia将一行的第一个字段视为其
我最近一直潜入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的后续调用会不断增加值. 使用可以改变的东西,作为主键似乎是一个独立于数据库系统的坏主意. 不要忘记,即使以第一种正常形式,您也不需要在Mnesia中规范化数据;在你的例子中,我将考虑以下结构: -record(user,{id,name,email,entries}). -record(entry,title,slug,users}). 其中条目和用户是ids列表.当然,这取决于你想要的查询. 编辑:固定为多对多,而不是多对一. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |