Skip to content

Database Schema

This page documents the complete PostgreSQL database schema for Alita Robot.

  • Total Tables: 26
  • Database Type: PostgreSQL
  • ORM: GORM
  • Migration Tool: golang-migrate

All tables use an auto-incremented id field as the primary key (internal identifier), while external identifiers like user_id and chat_id (Telegram IDs) are stored with unique constraints.

Benefits:

  • Decouples internal schema from external systems
  • Provides stability if external IDs change
  • Simplifies GORM operations with consistent integer primary keys
  • Better performance for joins and indexing
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('admin_id_seq'::regclass)
chat_idBIGINT
anon_adminBOOLEANfalse
created_atTIMESTAMP
updated_atTIMESTAMP
  • idx_admin_settings_chat
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
  • user_id -> users(user_id)
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('antiflood_settings_id_seq'::regclass)
chat_idBIGINT
limitBIGINT5
actionTEXT'mute'::text
modeTEXT'mute'::text
delete_antiflood_messageBOOLEANfalse
created_atTIMESTAMP
updated_atTIMESTAMP
flood_limitBIGINT5
  • idx_antiflood_chat_active
  • idx_antiflood_chat_flood_active
  • user_id -> users(user_id)
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('blacklists_id_seq'::regclass)
chat_idBIGINT
wordTEXT
actionTEXT'warn'::text
reasonTEXT
created_atTIMESTAMP
updated_atTIMESTAMP
  • idx_blacklists_chat_word_optimized
  • chat_id -> chats(chat_id)
  • user_id -> users(user_id)
  • chat_id -> chats(chat_id)
  • user_id -> users(user_id)
  • user_id -> users(user_id)
ColumnTypeNullableDefaultConstraints
idSERIALPRIMARY KEY
user_idBIGINT
chat_idBIGINT
answerVARCHAR(255)
attemptsINTEGER0
message_idBIGINT
expires_atTIMESTAMP
created_atTIMESTAMPCURRENT_TIMESTAMP
updated_atTIMESTAMPCURRENT_TIMESTAMP
  • idx_captcha_user_chat
  • idx_captcha_expires_at
ColumnTypeNullableDefaultConstraints
idBIGSERIALPRIMARY KEY
user_idBIGINT
chat_idBIGINT
unmute_atTIMESTAMP
created_atTIMESTAMPNOW()
  • idx_captcha_muted_user_chat
  • idx_captcha_unmute_at
ColumnTypeNullableDefaultConstraints
idSERIALPRIMARY KEY
chat_idBIGINTUNIQUE
enabledBOOLEANFALSE
captcha_modeVARCHAR(10)'math'
timeoutINTEGER2
failure_actionVARCHAR(10)'kick'
max_attemptsINTEGER3
created_atTIMESTAMPCURRENT_TIMESTAMP
updated_atTIMESTAMPCURRENT_TIMESTAMP
  • uk_captcha_settings_chat_id
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('channels_id_seq'::regclass)
chat_idBIGINT
channel_idBIGINT
created_atTIMESTAMP
updated_atTIMESTAMP
  • idx_channels_chat_update
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
ColumnTypeNullableDefaultConstraints
chat_idBIGINT
user_idBIGINT
  • idx_chat_users_user_id
  • idx_chat_users_chat_id
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('chats_id_seq'::regclass)
chat_idBIGINT
chat_nameTEXT
languageTEXT
usersJSONB
is_inactiveBOOLEANfalse
created_atTIMESTAMP
updated_atTIMESTAMP
  • idx_chats_chat_id_active
  • idx_chats_covering
  • idx_chats_users_gin
  • idx_chats_inactive
  • idx_chats_last_activity
  • idx_chats_activity_status
  • chat_id -> chats(chat_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('connection_id_seq'::regclass)
user_idBIGINT
chat_idBIGINT
connectedBOOLEANfalse
created_atTIMESTAMP
updated_atTIMESTAMP
  • idx_connection_user_id
  • idx_connection_chat_id
  • user_id -> users(user_id)
  • chat_id -> chats(chat_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('connection_settings_id_seq'::regclass)
chat_idBIGINT
enabledBOOLEANtrue
allow_connectBOOLEANtrue
created_atTIMESTAMP
updated_atTIMESTAMP
  • channel_id -> chats(chat_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('devs_id_seq'::regclass)
user_idBIGINT
is_devBOOLEANfalse
devBOOLEANfalse
sudoBOOLEANfalse
created_atTIMESTAMP
updated_atTIMESTAMP
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('disable_id_seq'::regclass)
chat_idBIGINT
commandTEXT
disabledBOOLEANtrue
created_atTIMESTAMP
updated_atTIMESTAMP
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('filters_id_seq'::regclass)
chat_idBIGINT
keywordTEXT
filter_replyTEXT
msgtypeBIGINT
fileidTEXT
nonotifBOOLEANfalse
filter_buttonsJSONB
created_atTIMESTAMP
updated_atTIMESTAMP
  • idx_filters_chat_optimized
  • chat_id -> chats(chat_id)
  • user_id -> users(user_id)
  • user_id -> users(user_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('greetings_id_seq'::regclass)
chat_idBIGINT
clean_service_settingsBOOLEANfalse
welcome_clean_oldBOOLEANfalse
welcome_last_msg_idBIGINT
welcome_enabledBOOLEANtrue
welcome_textTEXT
welcome_file_idTEXT
welcome_typeBIGINT
welcome_btnsJSONB
goodbye_clean_oldBOOLEANfalse
goodbye_last_msg_idBIGINT
goodbye_enabledBOOLEANtrue
goodbye_textTEXT
goodbye_file_idTEXT
goodbye_typeBIGINT
goodbye_btnsJSONB
auto_approveBOOLEANfalse
created_atTIMESTAMP
updated_atTIMESTAMP
  • idx_greetings_chat_enabled
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('locks_id_seq'::regclass)
chat_idBIGINT
lock_typeTEXT
lockedBOOLEANfalse
created_atTIMESTAMP
updated_atTIMESTAMP
  • idx_locks_chat_lock_lookup
  • idx_locks_covering
  • chat_id -> chats(chat_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('notes_id_seq'::regclass)
chat_idBIGINT
note_nameTEXT
note_contentTEXT
file_idTEXT
msg_typeBIGINT
buttonsJSONB
admin_onlyBOOLEANfalse
private_onlyBOOLEANfalse
group_onlyBOOLEANfalse
web_previewBOOLEANtrue
is_protectedBOOLEANfalse
no_notifBOOLEANfalse
created_atTIMESTAMP
updated_atTIMESTAMP
  • idx_notes_chat_name
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('notes_settings_id_seq'::regclass)
chat_idBIGINT
privateBOOLEANfalse
created_atTIMESTAMP
updated_atTIMESTAMP
  • chat_id -> chats(chat_id)
  • user_id -> users(user_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('pins_id_seq'::regclass)
chat_idBIGINT
msg_idBIGINT
clean_linkedBOOLEANfalse
anti_channel_pinBOOLEANfalse
created_atTIMESTAMP
updated_atTIMESTAMP
  • idx_pins_chat
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('report_chat_settings_id_seq'::regclass)
chat_idBIGINT
enabledBOOLEANtrue
statusBOOLEANtrue
blocked_listJSONB
created_atTIMESTAMP
updated_atTIMESTAMP
  • channel_id -> chats(chat_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('report_user_settings_id_seq'::regclass)
user_idBIGINT
enabledBOOLEANtrue
statusBOOLEANtrue
created_atTIMESTAMP
updated_atTIMESTAMP
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('rules_id_seq'::regclass)
chat_idBIGINT
rulesTEXT
rules_btnTEXT
privateBOOLEANfalse
created_atTIMESTAMP
updated_atTIMESTAMP
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
  • user_id -> users(user_id)
ColumnTypeNullableDefaultConstraints
idBIGSERIALPRIMARY KEY
user_idBIGINT
chat_idBIGINT
message_typeINTEGER1
contentTEXT
file_idTEXT
captionTEXT
attempt_idBIGINT
created_atTIMESTAMPNOW()
  • idx_stored_user_chat
  • idx_stored_attempt
  • attempt_id -> captcha_attempts(id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('users_id_seq'::regclass)
user_idBIGINT
usernameTEXT
nameTEXT
languageTEXT'en'::text
created_atTIMESTAMP
updated_atTIMESTAMP
  • idx_users_user_id_active
  • idx_users_covering
  • idx_users_last_activity
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
  • user_id -> users(user_id)
  • chat_id -> chats(chat_id)
  • user_id -> users(user_id)
  • chat_id -> chats(chat_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('warns_settings_id_seq'::regclass)
chat_idBIGINT
warn_limitBIGINT3
warn_modeTEXT
created_atTIMESTAMP
updated_atTIMESTAMP
  • chat_id -> chats(chat_id)
ColumnTypeNullableDefaultConstraints
idBIGINTnextval('warns_users_id_seq'::regclass)
user_idBIGINT
chat_idBIGINT
num_warnsBIGINT0
warnsJSONB
created_atTIMESTAMP
updated_atTIMESTAMP
  • idx_warns_users_user_id
  • idx_warns_users_chat_id
  • idx_warns_users_composite
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
  • chat_id -> chats(chat_id)
  • Users: Telegram users who interact with the bot
  • Chats: Telegram groups/channels managed by the bot
  • ChatUsers: Join table linking users to chats
  • User ↔ Chat: Many-to-many through chat_users
  • Chat → Settings: One-to-one (module-specific settings)
  • Chat → Content: One-to-many (filters, notes, rules, etc.)