77 lines
3.0 KiB
MySQL
77 lines
3.0 KiB
MySQL
|
|
-- Таблица пользователей
|
||
|
|
CREATE TABLE IF NOT EXISTS users (
|
||
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
|
|
login TEXT UNIQUE NOT NULL,
|
||
|
|
password_hash TEXT NOT NULL,
|
||
|
|
role TEXT NOT NULL DEFAULT 'user' CHECK(role IN ('user', 'global_admin')),
|
||
|
|
last_seen DATETIME,
|
||
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
|
|
);
|
||
|
|
|
||
|
|
-- Индекс для быстрого поиска по логину
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_users_login ON users(login);
|
||
|
|
|
||
|
|
-- Таблица профилей
|
||
|
|
CREATE TABLE IF NOT EXISTS profiles (
|
||
|
|
user_id INTEGER PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE,
|
||
|
|
display_name TEXT,
|
||
|
|
bio TEXT,
|
||
|
|
avatar_url TEXT
|
||
|
|
);
|
||
|
|
|
||
|
|
-- Таблица чатов
|
||
|
|
CREATE TABLE IF NOT EXISTS chats (
|
||
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
|
|
type TEXT NOT NULL CHECK(type IN ('private', 'group')),
|
||
|
|
title TEXT,
|
||
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
|
|
);
|
||
|
|
|
||
|
|
-- Индекс для фильтрации по типу чата
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_chats_type ON chats(type);
|
||
|
|
|
||
|
|
-- Таблица участников чатов
|
||
|
|
CREATE TABLE IF NOT EXISTS chat_members (
|
||
|
|
chat_id INTEGER NOT NULL REFERENCES chats(id) ON DELETE CASCADE,
|
||
|
|
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||
|
|
role TEXT NOT NULL DEFAULT 'member' CHECK(role IN ('member', 'admin')),
|
||
|
|
joined_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
PRIMARY KEY (chat_id, user_id)
|
||
|
|
);
|
||
|
|
|
||
|
|
-- Индекс для быстрого получения всех чатов пользователя
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_chat_members_user_id ON chat_members(user_id);
|
||
|
|
|
||
|
|
-- Индекс для быстрого получения участников чата
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_chat_members_chat_id ON chat_members(chat_id);
|
||
|
|
|
||
|
|
-- Таблица сообщений
|
||
|
|
CREATE TABLE IF NOT EXISTS messages (
|
||
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
|
|
chat_id INTEGER NOT NULL REFERENCES chats(id) ON DELETE CASCADE,
|
||
|
|
sender_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||
|
|
encrypted_body BLOB NOT NULL,
|
||
|
|
attachment_id INTEGER,
|
||
|
|
is_read BOOLEAN NOT NULL DEFAULT 0,
|
||
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
|
|
);
|
||
|
|
|
||
|
|
-- Индекс для быстрой загрузки истории чата
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_messages_chat_id_created_at ON messages(chat_id, created_at DESC);
|
||
|
|
|
||
|
|
-- Индекс для поиска сообщений по отправителю
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_messages_sender_id ON messages(sender_id);
|
||
|
|
|
||
|
|
-- Таблица вложений
|
||
|
|
CREATE TABLE IF NOT EXISTS attachments (
|
||
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
|
|
message_id INTEGER REFERENCES messages(id) ON DELETE SET NULL,
|
||
|
|
file_name TEXT NOT NULL,
|
||
|
|
file_size INTEGER NOT NULL,
|
||
|
|
storage_path TEXT NOT NULL,
|
||
|
|
mime_type TEXT NOT NULL,
|
||
|
|
uploaded_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
|
|
);
|
||
|
|
|
||
|
|
-- Индекс для поиска вложений по сообщению
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_attachments_message_id ON attachments(message_id);
|