niamtokik

niamtokik

Database flexible table design in Ecto?

Hey folk!

I have a database table design dilemma. I want a flexible design for some of my table, say, for example, the user table and I want to store some other information in dedicated table (for example, information about the other or other metadata).

CREATE  TABLE users (
  id PRIMARY KEY,
  name STRING
);

CREATE TABLE user_info (
  user_id INTEGER,
  metadata STRING,
  FOREIGN KEY user_id REFERENCES users (id)
);

With this solution, I have lot of difficulty to insert a correct data, and retrieve information based on the user name or id. I was thinking to create an embedded schema to correct that, but, I don’t know if it’s a good idea.

Another solution is to create a table with a new column dedicated for the information

CREATE  TABLE users (
  id PRIMARY KEY,
  name STRING,
  info_id INTEGER,
  FOREIGN KEY info_id REFERENCES user_info (id)
);

CREATE TABLE user_info (
  id INTEGER,
  metadata STRING,
);

In this case, it’s seems a lot easier to use it with Ecto and Ecto.Repo.preload/3, it return a user map containing the User fields but also all information linked to him.

Finally, the last one, is to create an associative table for users and user_info.

CREATE TABLE users (
  id PRIMARY KEY,
  name STRING
);

CREATE TABLE users_info (
  id PRIMARY KEY,
  metadata STRING
);

CREATE TABLE users_info_association (
  user_id INTEGER,
  user_info_id INTEGER,
  FOREIGN KEY user_id REFERENCES users (id),
  FOREIGN KEY user_info_id REFERENCES users_info (id)
);

What could be the best way to do it for you and in particular with Ecto?

Most Liked

LostKobrakai

LostKobrakai

I’m not really sure how those three options should affect ecto. It should be able to easily handle all three of those setups. Can you describe your difficulties?

LostKobrakai

LostKobrakai

user
|> cast(params, […])
|> cast_assoc(:users_info)
|> Repo.…

This should work for any assocation be it belongs_to, has_one has_one through or even many_to_many if you have a list.

Where Next?

Popular in Questions Top

Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New

Other popular topics Top

rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New

We're in Beta

About us Mission Statement