schema - ParaLogia/discrud GitHub Wiki
Database Schema
users
data type |
column name |
details |
integer |
id |
not null, primary key |
string |
username |
not null |
integer |
tag |
not null |
string |
email |
not null |
string |
password_digest |
not null |
string |
session_token |
not null |
datetime |
created_at |
not null |
datetime |
updated_at |
not null |
- index on
[username, tag], unique: true
- index on
email, unique: true
- index on
session_token, unique: true
servers
data type |
column name |
details |
integer |
id |
not null, primary key |
integer |
owner_id |
not null, foreign key |
string |
name |
not null |
text |
description |
not null |
boolean |
is_private |
not null, default: false |
string |
invite_token |
not null |
datetime |
created_at |
not null |
datetime |
updated_at |
not null |
owner_id
references users
- index on
owner_id
invite_token
is used for a permanent invitation link
- index on
invite_token, unique: true
server_memberships
data type |
column name |
details |
integer |
id |
not null, primary key |
integer |
server_id |
not null, foreign key |
integer |
user_id |
not null, foreign key |
datetime |
created_at |
not null |
datetime |
updated_at |
not null |
server_id
references servers
user_id
references users
- index on
[user_id, server_id], unique: true
channels
data type |
column name |
details |
integer |
id |
not null, primary key |
integer |
server_id |
not null, foreign key |
string |
name |
not null |
text |
description |
not null |
datetime |
created_at |
not null |
datetime |
updated_at |
not null |
server_id
references servers
- index on
server_id
messages
data type |
column name |
details |
integer |
id |
not null, primary key |
integer |
author_id |
not null, foreign key |
integer |
thread_id |
not null, foreign key |
string |
thread_type |
not null |
text |
body |
not null |
datetime |
created_at |
not null |
datetime |
updated_at |
not null |
author_id
references users
thread
represents a polymorphic association between messages and channels
/dm_threads
- index on
author_id
- index on
[thread_id, thread_type]
dm_threads
data type |
column name |
details |
integer |
id |
not null, primary key |
datetime |
created_at |
not null |
datetime |
updated_at |
not null |
dm_memberships
data type |
column name |
details |
integer |
id |
not null, primary key |
integer |
dm_thread_id |
not null, foreign key |
integer |
member_id |
not null, foreign key |
datetime |
created_at |
not null |
datetime |
updated_at |
not null |
member_id
references users
dm_thread_id
references dm_threads
- index on
member_id
- index on
dm_thread_id
invitations
(Bonus 2 only)
data type |
column name |
details |
integer |
id |
not null, primary key |
integer |
server_id |
not null, foreign key |
integer |
invitee_id |
foreign key |
string |
token |
not null |
datetime |
expiry |
not null |
datetime |
created_at |
not null |
datetime |
updated_at |
not null |
server_id
references servers
invitee_id
references users
- index on
[invitee_id, server_id], unique: true
- index on
token, unique: true
- used for temporary invitations
- invitee_id used for private invitations; allow null for general invitations
Notes
servers#is_private
won't come into play until private servers are introduced
- DMs will require more thought, since they are very similar to channels, but don't belong to a normal server
- Note the distinction between
servers#invite_token
and invitations#token
. They are for permanent and temporary invitation, respectively