[erlang-questions] Wrap my mind around NoSQL (Mnesia)

Grzegorz Junka list1@REDACTED
Tue Nov 28 09:16:15 CET 2017


You need to consider the impact that storing a list of user tags or urls 
in one filed can have on query times, i.e. {username, {urls, [tags]}} 
would require that you read and store the complete list of urls and tags 
when you need to add or remove one element. I would rather have a table 
with records {userId, url}. It will automatically have an index on 
userId. And then I would construct a select to query all urls for the 
given userId. Then a separate table {userName, userId}. Then a separate 
table {{userId, url}, tag} where {userId, url} is the key. I could also 
have {url, urlId} since multiple users can store the same url. That 
would save memory on having to remember the same url string multiple 
times. Then for any user I would have {userId, urlId} and {{userId, 
urlId}, tag}.

I hope that helps.


On 24/11/2017 14:50, Silas wrote:
> Hi!
> (This is mainly a question about NoSQL conceptions.  If it is the 
> wrong place to ask, sorry for that and, please, let me know).
> After years using RDBMS (with structured and OO paradigms at the 
> programming language side) I'm diving into functional programming.  
> When choosing a programming language to practice, I immediately fell 
> in love with Erlang for this simplicity and beauty.
> After reading some documentation, some chapters of a book and trying 
> simple projects I decided to try a more complex project with Mnesia.  
> It is a social bookmarks website (something similar to what 
> del.icio.us is) where user can bookmark a URL and associate one or 
> more tags with it.  For instance, some could bookmark "erlang.org" to 
> tags "functionalprogramming", "programminglanguage" and others.  Users 
> also can query other users bookmarks, see what links are associated 
> with a tag and what tags are associated with a given bookmark.
> In my mind, an RDBMS is a perfect solution for this problem.  I'm 
> trying to fit it into the key -> value model, though.  My first 
> question is: is this possible or I'm just doing the wrong thing by 
> forcing the wrong solution?
> For what I understood, I need to get rid of normalization rules. So I 
> devised something more or less like that:
> User table: {username, {urls, [tags]}} % set
> UserTag table: {user, [tags]} % set
> TagUrls table: {tag, url} % bag
> TagUsers table: {tag, user} % bag
> Urlusers table: {url, user} %bag
> UrlTags table: {url, tag} %bag
> It is still a bit confusing where I'd use a set, a bag or an 
> ordered_set but I think you got the whole picture.
> Any help?
> Thanks!

More information about the erlang-questions mailing list