Skip to content
Zalkifl Syed edited this page Jan 30, 2019 · 14 revisions

Database Schema

Users

column name data type details
id integer not null, primary_key
username string not null, unique, indexed
email string not null, unique, indexed
password_digest string not null
session_token string not null
  • index on [username], unique: true
  • index on [email], unique: true
  • has_many friends, tabs, groups, comments.

Tabs

column name data type details
id integer not null, primary_key
name string not null
restaurant_id integer foreign_key, allow null, indexed
settled boolean default: false
total integer not null
group_id integer foreign_key, not null, indexed
lender_id integer foreign_key, not null, indexed
  • group_id references group
  • can be null if only splitting with one other person.
  • lender_id references user, a user who paid the bill.
  • restaurant_id references restaurant
  • index on [group_id]
  • index on [restaurant_id]
  • index on [lender_id]

Restaurants

column name data type details
id integer not null, primary_key
name string not null, indexed
address string not null
longitude string not null, indexed
latitude string not null, indexed
  • be able to map location, to keep track where each split occurred.
  • index on [name]
  • index on [longitude, latitude]

Friends

column name data type details
id integer not null, primary_key
friend_id integer not null, indexed
user_id integer not null, indexed
accepted boolean default: false
  • friend_id references user
  • user_id references user, who carries the friend list
  • index on [friend_id]
  • index on [user_id]
  • index on [user_id, friend_id], unique: true

Comments

column name data type details
id integer not null, primary_key
tab_id string not null, indexed
comment body not null
commenter_id integer foreign_key, allow null, indexed
  • commenter_id commentator references user
  • tab_id references tab
  • index on [tab_id]
  • index on [commenter_id]

Group

column name data type details
id integer not null, primary_key
group_name string not null, indexed
  • index on [group_name]

Split (Join table)

column name data type details
id integer not null, primary_key
tab_id integer foreign_key, not null, indexed
user_id integer foreign_key, not null, indexed
amount_owed integer allow null
paid boolean default: false
  • a joins table, to store information about a check/split all in one place.
  • easy access, to delete or remove properties from a user.
  • tab_id references tab
  • user_id references user
  • index on [tab_id]
  • index on [user_id]

Interactions (Join table)

column name data type details
id integer not null, primary_key
group_id integer foreign_key, not null, indexed
user_id integer foreign_key, not null, indexed
  • group_id references group
  • user_id references user
  • index on [group_id]
  • index on [user_id]
  • index on [:user_id, :group_id], unique: true

Clone this wiki locally