数据库 – 使用Mnesia保持关系完整性

前端之家收集整理的这篇文章主要介绍了数据库 – 使用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列表.当然,这取决于你想要的查询.

编辑:固定为多对多,而不是多对一.

猜你在找的MsSQL相关文章