I'm implementing functionality to track which articles a user has read.
create_table "article", :force => true do |t| t.string "title" t.text "content" end
This is my migration so far:
create_table :user_views do |t| t.integer :user_id t.integer :article_id end
The user_views table will always be queried to look for both columns, never only one. My question is how my index should look like. Is there a difference in the order of these tables, should there be some more options to it or whatever. My target DB is Postgres.
add_index(:user_views, [:article_id, :user_id])
Thanks.
UPDATE:
Because only one row containing the same values in both columns can exist (since in knowing if user_id HAS read article_id), should I consider the :unique option? If I'm not mistaken that means I don't have to do any checking on my own and simply make an insert every time a user visits an article.
A composite index is an index on multiple columns. MySQL allows you to create a composite index that consists of up to 16 columns. A composite index is also known as a multiple-column index.
An index with more than one column aggregates the contents.
Multicolumn indexes can: be created on up to 32 columns. be used for partial indexing.
Yes you can have too many indexes as they do take extra time to insert and update and delete records, but no more than one is not dangerous, it is a requirement to have a system that performs well.
The order does matter in indexing.
[:user_id, :article_id]
, you can perform a fast query on user_id
or user_id AND article_id
, but NOT on article_id
.Your migration add_index
line should look something like this:
add_index :user_views, [:user_id, :article_id]
An easy way to do this in Rails is to use validates
in your model with scoped uniqueness
as follows (documentation):
validates :user, uniqueness: { scope: :article }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With