Despite Elixir’s general preference for avoiding side effects, storing and sharing data is a fundamental side effect needed for a wide variety of projects.
Because Elixir works well with Erlang, you can use Erlang Term Storage (ETS) to help you store and manipulate your data, and the Mnesia database provides additional features for reliable distributed storage.
As you saw in “From Maps to Structs”, Elixir’s structs allow you to use names to connect with data rather than order (as with tuples). Structs, however, are based on maps, which are new to Erlang and Elixir. Before maps existed, Erlang had to solve the problem of keeping structured data, and that solution was the concept of records. As with structs, you can read, write, and pattern match data in a record without having to worry about the details of where in a tuple a field lurks or whether someone’s added a new field.
Records are not especially loved in Erlang, and are supported but not encouraged in Elixir. The record definition requirement creates headaches. However, records are common in Erlang APIs and run efficiently, so they are still worth understanding. At the very least you’ll have a better sense of what people are arguing about in discussions of Elixir and Erlang data structures.
There are still tuples underneath records, and occasionally Elixir will expose them to you. Do not attempt to use the tuple representation directly, ...