Skip to content

Database Schema

BillTheDev edited this page Mar 3, 2022 · 8 revisions

users

column name data type detail
id integer null: false, primary key
username string null: false, unique, index
email string null: false, unique, index
password_digest string null: false
session_token string null: true, unique, index
created_at datetime null: false
updated_at datetime null: false
  • has_many include: playlists, likes, liked_songs, liked_playlists, liked_artists, liked_albums
  has_many :liked_songs, 
    through: :likes,
    source: :likeable, 
    source_type: :Song
  
  has many :playlists,
    primary_key: :id,
    foreign_key: :creator_id,
    class_name: :Playlist

genres

column name data type detail
id integer null: false, primary key
name string null: false, unique, index
created_at datetime null: false
updated_at datetime null: false
  • has_many include: artists

artists

column name data type detail
id integer null: false, primary key
name string null: false, unique, index
genre_id integer null: false, foreign key
created_at datetime null: false
updated_at datetime null: false
  • has_many include: albums
  • belongs_to include: genre

albums

column name data type detail
id integer null: false, primary key
name string null: false, unique, index
year integer null: false
artist_id integer null: false, index, foreign key
created_at datetime null: false
updated_at datetime null: false
  • has_many include: songs
  • belongs_to include: artist

songs

column name data type detail
id integer null: false, primary key
title string null: false, index
album_id string null: false, index, foreign key
created_at datetime null: false
updated_at datetime null: false
  • has_many include:
  • belongs_to include: album

playlists

column name data type detail
id integer null: false, primary key
title string null: false, unique, index
creator_id integer null: false, foreign key
created_at datetime null: false
updated_at datetime null: false
  • has_many include: playlists_songs
  • belongs_to include: creator -> user
  • has_many :songs, through: :playlists_songs

playlists_songs

column name data type detail
id integer null: false, primary key
playlist_id integer null: false, foreign key
song_id integer null: false, foreign_key
created_at datetime null: false
updated_at datetime null: false
  • belongs_to include: playlists, songs
Playlist.find(1).songs
SELECT * FROM songs
  INNER JOIN playlists_songs ON playlists_songs.song_id = songs.id
  where playlists_songs.playlist_id = 1

Likes

column name data type detail
id integer null: false, primary key
user_id integer null: false, foreign key
likeable_id integer null: false, foreign_key
likeable_type string null: false
created_at datetime null: false
updated_at datetime null: false
  • belongs_to include: user, likeable

  • belongs_to :likeable, polymorphic: true

Clone this wiki locally