Ecto Join/Select Database Efficiency Questions

I don’t think there is a performance difference between map and tuple. But tuple, especially long tuple, is hard to remember the position of each element. So I rarely use tuples for database results.

For better maintainability, why not create relationship and use preload like this:

query = from(Child, where: [is_active: true], preload: [:parent])
children = Repo.all(query)

Enum.each(children, fn child ->
  child.name
  child.parent.logo
end)

If you have to use inner join (i.e. some child has no parent), then:

from(
  c in Child,
  join: p in assoc(c, :parent),
  where: [is_active: true]
  preload: [parent: p]
)

You can also use select to reduce the fields needed. The key point is that using struct/map is much clear than tuple.