8.7 KiB
8.7 KiB
Проверка схемы базы данных
Таблица users
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(255),
email VARCHAR(255) UNIQUE,
address VARCHAR(255) UNIQUE,
first_name_encrypted TEXT,
last_name_encrypted TEXT,
status VARCHAR(50) DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
role user_role DEFAULT 'user',
first_name VARCHAR(255),
last_name VARCHAR(255),
preferred_language JSONB,
is_blocked BOOLEAN DEFAULT false,
blocked_at TIMESTAMP
);
Колонки:
id- SERIAL PRIMARY KEYusername- VARCHAR(255)email- VARCHAR(255) UNIQUEaddress- VARCHAR(255) UNIQUEfirst_name_encrypted- TEXT (зашифрованное)last_name_encrypted- TEXT (зашифрованное)status- VARCHAR(50) DEFAULT 'active'created_at- TIMESTAMP DEFAULT CURRENT_TIMESTAMPupdated_at- TIMESTAMP DEFAULT CURRENT_TIMESTAMProle- user_role DEFAULT 'user'first_name- VARCHAR(255) (незашифрованное)last_name- VARCHAR(255) (незашифрованное)preferred_language- JSONBis_blocked- BOOLEAN DEFAULT falseblocked_at- TIMESTAMP
Таблица conversations
CREATE TABLE conversations (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
title VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
conversation_type VARCHAR(50) DEFAULT 'user_chat'
);
Колонки:
id- SERIAL PRIMARY KEYuser_id- INTEGER REFERENCES users(id)title- VARCHAR(255) (НЕ зашифрованное!)created_at- TIMESTAMP DEFAULT CURRENT_TIMESTAMPupdated_at- TIMESTAMP DEFAULT CURRENT_TIMESTAMPconversation_type- VARCHAR(50) DEFAULT 'user_chat'
Таблица messages
CREATE TABLE messages (
id SERIAL PRIMARY KEY,
conversation_id INTEGER REFERENCES conversations(id) ON DELETE CASCADE,
sender_type_encrypted TEXT NOT NULL,
sender_id INTEGER,
content_encrypted TEXT,
channel_encrypted TEXT NOT NULL,
role_encrypted TEXT NOT NULL DEFAULT 'user',
direction_encrypted TEXT,
metadata JSONB,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
tokens_used INTEGER DEFAULT 0,
is_processed BOOLEAN DEFAULT false,
role VARCHAR(20) NOT NULL DEFAULT 'user',
attachment_filename TEXT,
attachment_mimetype TEXT,
attachment_size BIGINT,
attachment_data BYTEA,
direction VARCHAR(8),
message_type VARCHAR(20) DEFAULT 'public'
);
Колонки:
id- SERIAL PRIMARY KEYconversation_id- INTEGER REFERENCES conversations(id)sender_type_encrypted- TEXT NOT NULL (зашифрованное)sender_id- INTEGERcontent_encrypted- TEXT (зашифрованное)channel_encrypted- TEXT NOT NULL (зашифрованное)role_encrypted- TEXT NOT NULL DEFAULT 'user' (зашифрованное)direction_encrypted- TEXT (зашифрованное)metadata- JSONBcreated_at- TIMESTAMP DEFAULT CURRENT_TIMESTAMPuser_id- INTEGER REFERENCES users(id)tokens_used- INTEGER DEFAULT 0is_processed- BOOLEAN DEFAULT falserole- VARCHAR(20) NOT NULL DEFAULT 'user' (НЕ зашифрованное!)attachment_filename- TEXTattachment_mimetype- TEXTattachment_size- BIGINTattachment_data- BYTEAdirection- VARCHAR(8) (НЕ зашифрованное!)message_type- VARCHAR(20) DEFAULT 'public'
Триггеры:
trg_set_message_user_id- автоматически устанавливает user_id
Таблица conversation_participants
CREATE TABLE conversation_participants (
id SERIAL PRIMARY KEY,
conversation_id INTEGER REFERENCES conversations(id) ON DELETE CASCADE,
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(conversation_id, user_id)
);
Колонки:
id- SERIAL PRIMARY KEYconversation_id- INTEGER REFERENCES conversations(id)user_id- INTEGER REFERENCES users(id)created_at- TIMESTAMP DEFAULT CURRENT_TIMESTAMP
Индексы:
- PRIMARY KEY на
id - UNIQUE CONSTRAINT на
(conversation_id, user_id) - Индекс на
conversation_id - Индекс на
user_id
Таблица admin_read_messages
CREATE TABLE admin_read_messages (
admin_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
last_read_at TIMESTAMP NOT NULL,
PRIMARY KEY (admin_id, user_id)
);
Колонки:
admin_id- INTEGER NOT NULL REFERENCES users(id) (админ)user_id- INTEGER NOT NULL REFERENCES users(id) (пользователь)last_read_at- TIMESTAMP NOT NULL (время последнего прочтения)
Индексы:
- PRIMARY KEY на
(admin_id, user_id)
Таблица admin_read_contacts
CREATE TABLE admin_read_contacts (
admin_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
contact_id TEXT NOT NULL,
read_at TIMESTAMP NOT NULL DEFAULT NOW(),
PRIMARY KEY (admin_id, contact_id)
);
Колонки:
admin_id- INTEGER NOT NULL REFERENCES users(id) (админ)contact_id- TEXT NOT NULL (ID контакта)read_at- TIMESTAMP NOT NULL DEFAULT NOW() (время прочтения)
Индексы:
- PRIMARY KEY на
(admin_id, contact_id) - Индекс на
admin_id - Индекс на
contact_id
Таблица user_identities
CREATE TABLE user_identities (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
provider_encrypted TEXT NOT NULL,
provider_id_encrypted TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Колонки:
id- SERIAL PRIMARY KEYuser_id- INTEGER REFERENCES users(id) (пользователь)provider_encrypted- TEXT NOT NULL (зашифрованный провайдер)provider_id_encrypted- TEXT NOT NULL (зашифрованный ID провайдера)created_at- TIMESTAMP DEFAULT CURRENT_TIMESTAMP
Индексы:
- PRIMARY KEY на
id - Индекс на
user_id
Таблица user_preferences
CREATE TABLE user_preferences (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
preference_key VARCHAR(50) NOT NULL,
preference_value TEXT,
metadata JSONB DEFAULT '{}',
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
UNIQUE(user_id, preference_key)
);
Колонки:
id- SERIAL PRIMARY KEYuser_id- INTEGER NOT NULL REFERENCES users(id) (пользователь)preference_key- VARCHAR(50) NOT NULL (ключ настройки)preference_value- TEXT (значение настройки)metadata- JSONB DEFAULT '{}' (метаданные)created_at- TIMESTAMP NOT NULL DEFAULT NOW()updated_at- TIMESTAMP NOT NULL DEFAULT NOW()
Индексы:
- PRIMARY KEY на
id - Индекс на
user_id - UNIQUE CONSTRAINT на
(user_id, preference_key)
Таблица user_tag_links
CREATE TABLE user_tag_links (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
tag_id INTEGER NOT NULL REFERENCES user_rows(id) ON DELETE CASCADE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(user_id, tag_id)
);
Колонки:
id- SERIAL PRIMARY KEYuser_id- INTEGER NOT NULL REFERENCES users(id) (пользователь)tag_id- INTEGER NOT NULL REFERENCES user_rows(id) (тег)created_at- TIMESTAMP DEFAULT CURRENT_TIMESTAMP
Индексы:
- PRIMARY KEY на
id - Индекс на
user_id - Индекс на
tag_id - UNIQUE CONSTRAINT на
(user_id, tag_id)
Анализ проблем в коде
Теперь, имея полную схему базы данных, давайте проверим код на соответствие: