Twfo326

Twfo326

As a novice dev I’m trying to keep the curriculum as lean as possible.

My requirements are modest: build simple CRUD apps with Phoenix liveview, a key value store and auth. Scalability is a non concern.

MNESIA and AMNESIA seem like viable alternatives without the added learning overhead of SQL, Postgres, and Ecto.

But, I’m struggling to find practical learning resources, outside of these few:

https://code.tutsplus.com/articles/store-everything-with-elixir-and-mnesia--cms-29821

I’d appreciate any other recommendations, the more project based/practical the better.

Showing Posts 1 to 8

Twfo326

Twfo326 OP

Thanks, this is exactly what I was looking for. Especially, “Erlang for Great Good!” - engaging, in depth and applied to a practical context that makes it easier to grok.

sheharyarn

sheharyarn

I’m the author of Memento, an Elixir wrapper around :mnesia. I’ve written various use-cases and examples in the Memento docs, which might be somewhat useful.

Twfo326

Twfo326 OP

Thank you, this looks a lot more intuitive than vanilla Mnesia and I appreciate the effort that went into the docs.

Sebb

Sebb

Just had a look at Memento.

I only did very basic stuff with ets/mnesia, but what bugged me were the match-specs.

Please correct if I’m wrong, but as I understand it …

if you got a table like this

Mnesia.create_table(Person, [attributes: [:id, :name, :job]])

and you want to query all persons with an :id > 3 you got to tell the match-spec about the structure you want to query by giving the positions of all attributes, these you can then in turn use in an expression.

Mnesia.dirty_select(Person, [{{Person, :"$1", :"$2", :"$3"}, [{:>, :"$1", 3}], [:"$$"]}])

This becomes annoying at the latest when you want to change the table, eg if you want to add an attribute you’d have to change all match-specs (add "$4" etc).

Helpers like :ets.fun2ms

iex> :ets.fun2ms(fn {id, name, job} when id > 3 -> {id, name, job} end) 
[{{:"$1", :"$2", :"$3"}, [{:>, :"$1", 3}], [{{:"$1", :"$2", :"$3"}}]}]

or GitHub - ericmj/ex2ms: :ets.fun2ms for Elixir, translate functions to match specifications · GitHub do not really help, because while they make it easier to write specs, you’ll still have to update when you change the table.

Memento keeps track of the positions of the table’s attributes so you can use keys in your queries:

Memento.Query.select(Person, [{:>, :id, 3}])

:+1:

moxford

moxford

Just be very (very) careful and with both eyes (all four in my case) WIDE open about the pitfalls of deploying mnesia in production environments due to the split-brain/resolution issues.

Great for learning, I liked it a lot, but operationally it became a nightmare/tech-debt item.

Cheers,
-mox

Sebb

Sebb

what’s that? can you elaborate?

derek-zhou

derek-zhou

Mnesia is a simple solution designed for a small number of nodes (maybe a couple of dozens max) all reside in the same data center. If you stretch it beyond that you will get burned. Most people are perfectly happy with the limit though.

— All posts loaded —

Where Next? Top

Trending in Chat/Questions Top

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews