<div dir="ltr">Vans, I think the second approach you mentioned is more in-lined to what I'm looking for cause I'm trying to stay away from the data being relational. Instead I would like to work more with RDF triples. Thank you so much for your help!<div><br></div><div>-Danniel</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 24, 2017 at 10:25 AM, Vans S <span dir="ltr"><<a href="mailto:vans_163@yahoo.com" target="_blank">vans_163@yahoo.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">>  I try to stay away from normalized data so have more flexibility in terms of storing and retrieving data.<br>
<br>
</span>In an ideal world I would like mnesia to support maps. Then you can drop the record and mnesia becomes a document db, you give it the primary/secondary indexes as you create the table,<br>
it will find those in the maps that are the content.<br>
<span class=""><br>
<br>
> However, making relationships or pointers to other records with different types is still kinda vague. I'm prett ynew to erlang but I think I can start with this and learn further.<br>
</span>This is tough for me too. If anyone has good ideas I'm all ears.<br>
<br>
The simplest approach is writing a module with the same name as the tables record name and putting the logic into there.  The associations would be %{address_ref=> uuid4, wallet_ref=> uuid4}, then to find the wallet associated with a particular user you would just do :mnesia.read({:db_wallet, wallet_ref}).<br>
<br>
<br>
Another approach is a seperate sql style reference table,  db_r_user_wallet to map the uuid references.  This has the advantage of keeping the data cleaner as you don't have refs in there.<br>
<br>
Personally I use the first approach, and only considered the second.<br>
<br>
Mnesia's transactions either succeed or fail, so you can do complex things in a single transaction like touching multiple tables, and if something goes wrong you wont have a half committed transaction.<br>
<br>
One of my recent projects was a compute cloud and attaching disks to virtual machines looks like this:<br>
<br>
-module(db_disk).<br>
<br>
<br>
attach(UuidOwner, UuidVm, UuidDisk) -><br>
    ?ENSURE_OWNER(OwnerUuid, UuidVm, UuidDisk),<br>
    ?ENSURE_ATTACHABLE(UuidVm, UuidDisk),<br>
<br>
    ?T(<br>
        ok = mnesia:write({db_disk, UuidDisk, %{attached_to=> %{UuidVm=> UuidVm}}})<br>
    ).<br>
<br>
<br>
-module(db_vm).<br>
<br>
disks(OwnerUuid, UuidVm) -><br>
    ?ENSURE_OWNER(OwnerUuid, UuidVm),<br>
    mnesia:activity(transcation, fun()-><br>
        mnesia:match_object({db_disk, UuidVm, %{attached_to=> %{UuidVm=>_}}})<br>
    end).<br>
<br>
<br>
The reason 'attached_to' == %{} is because of a hack for a missing data type / maps functionality in erlang.<br>
Maps are new and selects/matches are not able to work on lists, unless someone can tell me how.<br>
<br>
Ideally %{UuidVm=> UuidVm} could be simplified to %{UuidVm} if erlang were to allow sets like usage with<br>
map syntax. And %{UuidVm=> _} would also become %{UuidVm}.<br>
<br>
Im not aware of a way in a match/select to do a lists:member/2.<br>
<br>
Each disk can be attached to multiple VMs in the case of network shared block storage.<br>
<span class=""><br>
<br>
<br>
On Friday, March 24, 2017 12:28 PM, Danniel Condez <<a href="mailto:ducondez@gmail.com">ducondez@gmail.com</a>> wrote:<br>
<br>
<br>
<br>
Hi Vans,<br>
<br>
Looks like this is a pretty simple and flexible solution. I'm looking deeper into mnesia and found `Object based programming in mnesia`(<a href="http://erlang.org/doc/apps/mnesia/Mnesia_chap5.html#id82246" rel="noreferrer" target="_blank">http://erlang.org/doc/<wbr>apps/mnesia/Mnesia_chap5.html#<wbr>id82246</a>) to be close to what I'm trying to achieve. I try to stay away from normalized data so have more flexibility in terms of storing and retrieving data. However, making relationships or pointers to other records with different types is still kinda vague. I'm prett ynew to erlang but I think I can start with this and learn further.<br>
<br>
<br>
On Fri, Mar 24, 2017 at 7:45 AM, Vans S <<a href="mailto:vans_163@yahoo.com">vans_163@yahoo.com</a>> wrote:<br>
<br>
A mnesia table with the key being the uuid of the object.<br>
><br>
>{db_mytable, uuid4, #{}}<br>
><br>
>You have full fold/match/select available to you now.<br>
><br>
</span>>[Valid] = :mnesia.match_object({:db_ mytable, _, #{auth=>#{token=> "353442323232"}})<br>
<div class="HOEnZb"><div class="h5">><br>
><br>
><br>
>On Friday, March 24, 2017 10:13 AM, Steve Davis <steven.charles.davis@gmail. com> wrote:<br>
><br>
><br>
><br>
>Simplest (and most portable) would be:<br>
><br>
><br>
><br>
>for the put/write: term_to_binary(Map), for the get/read: binary_to_term(Blob)<br>
><br>
>_____________________________<wbr>_ _________________<br>
><br>
>erlang-questions mailing list<br>
><br>
><a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
><br>
><a href="http://erlang.org/mailman/" rel="noreferrer" target="_blank">http://erlang.org/mailman/</a> listinfo/erlang-questions<br>
><br>
><br>
><br>
</div></div></blockquote></div><br></div>