Создаю онлайн-сервис для чтения книг. День 1. Проектирование БД
Всем привет, хочу вам показать свои шаги по созданию онлайн сервиса для чтения книг.
🤔 Идея проекта
Создание платформы для удобного чтения книг в формате PDF с синхронизацией прогресса на всех устройствах.
Ключевые фичи:
Интерактивные элементы для работы с текстом (закладки, заметки).
Интеграция с ИИ (например, перевод и анализ текста через DeepSeek).
Персонализированные рекомендации.
👀 Начало работы: проектирование БД
Спроектирована структура базы данных для поддержки функционала сервиса.
Представлю функционал в виде use-case диаграммы.
Как видно по фотографии, есть 2 роли — пользователь и администратор. При этом администратор может управлять всем содержимым сервиса, а пользователь только своим аккаунтом, и всем, что с ним связано.
Советуясь со своим внутренним голосом я составил структуру базы данных
🗃️ Структура базы данных
Users
id: INT, Primary Key, уникальный идентификатор пользователя (автоинкремент).
nickname: NVARCHAR(50), псевдоним пользователя.
description: NVARCHAR(150), описание профиля пользователя (опционально).
avatar_image_path: NVARCHAR(255), путь к изображению профиля пользователя (по умолчанию 'default-avatar.png').
name: NVARCHAR(100), имя пользователя.
email: NVARCHAR(150), уникальный адрес электронной почты пользователя.
password_hash: NVARCHAR(255), хэш пароля пользователя.
id_role: INT, идентификатор роли пользователя (по умолчанию 0). Связан с таблицей Roles.
is_banned: BIT, статус блокировки пользователя (по умолчанию FALSE).
created_at: DATETIME, дата и время создания записи.
Roles
id: INT, Primary Key, уникальный идентификатор роли (автоинкремент).
name: NVARCHAR(20), название роли (например, "admin" или "user").
BannedUsers
id: INT, Primary Key, уникальный идентификатор записи (автоинкремент).
id_user: INT, идентификатор заблокированного пользователя. Связан с таблицей Users.
ban_reason: NVARCHAR(200), причина блокировки (опционально).
banned_at: DATETIME, дата и время блокировки.
Books
id: INT, Primary Key, уникальный идентификатор книги (автоинкремент).
name: NVARCHAR(200), название книги.
description: NVARCHAR(250), краткое описание книги.
id_author: INT, идентификатор автора книги. Связан с таблицей Users.
cover_image_path: NVARCHAR(250), путь к обложке книги.
file_book_path: NVARCHAR(200), путь к файлу книги.
id_category: INT, идентификатор категории книги. Связан с таблицей Categories.
is_private: BIT, флаг приватности книги (0 — публичная, 1 — приватная).
created_at: DATETIME, дата и время создания записи (опционально).
Categories
id: INT, Primary Key, уникальный идентификатор категории (автоинкремент).
name: NVARCHAR(100), название категории.
Libraries
id: INT, Primary Key, уникальный идентификатор записи (автоинкремент).
id_author: INT, идентификатор пользователя, владеющего библиотекой. Связан с таблицей Users.
id_book: INT, идентификатор книги, добавленной в библиотеку. Связан с таблицей Books.
created_at: DATETIME, дата и время добавления книги в библиотеку.
progress_page: INT, номер текущей страницы, на которой находится пользователь (по умолчанию 0).
Bookmarks
id: INT, Primary Key, уникальный идентификатор записи (автоинкремент).
id_library: INT, идентификатор библиотеки, к которой относится закладка. Связан с таблицей Libraries.
page: INT, номер страницы, на которую сделана закладка.
comment: NVARCHAR(100), комментарий к закладке.
created_at: DATETIME, дата и время создания закладки.
BookReviews
id: INT, Primary Key, уникальный идентификатор отзыва (автоинкремент).
id_author: INT, идентификатор автора отзыва. Связан с таблицей Users.
id_book: INT, идентификатор книги, к которой относится отзыв. Связан с таблицей Books.
comment: NVARCHAR(500), текст отзыва.
rating: TINYINT, рейтинг книги (число от 0 до 5).
created_at: DATETIME, дата и время создания отзыва.
LikesReviews
id: INT, Primary Key, уникальный идентификатор записи (автоинкремент).
id_author: INT, идентификатор пользователя, который поставил реакцию. Связан с таблицей Users.
id_review: INT, идентификатор отзыва, к которому относится реакция. Связан с таблицей BookReviews.
reaction_type: TINYINT, тип реакции (например, лайк или дизлайк).
created_at: DATETIME, дата и время установки реакции.
Logs
id: INT, Primary Key, уникальный идентификатор записи (автоинкремент).
id_user: INT, идентификатор пользователя, совершившего действие. Связан с таблицей Users.
action: NVARCHAR(200), описание действия.
created_at: DATETIME, дата и время совершения действия.
UserSubscribers
id: INT, Primary Key, уникальный идентификатор записи (автоинкремент).
id_author: INT, идентификатор пользователя, на которого подписан другой пользователь. Связан с таблицей Users.
id_subscriber: INT, идентификатор пользователя, который подписан на другого пользователя. Связан с таблицей Users.
created_at: DATETIME, дата и время создания подписки.
UserSessions
id: INT, Primary Key, уникальный идентификатор записи (автоинкремент).
id_user: INT, идентификатор пользователя, которому принадлежит сессия. Связан с таблицей Users.
refresh: NVARCHAR(255), refresh токен.
expires_in: DATETIME, дата и время истечение refresh токена.
С уверенностью 100% я могу сказать, что база данных будет меняться, но это будет на следующих этапах.
🔧 Следующие шаги
Разработка сервера на .NET 7.0 для обработки HTTP-запросов.
Реализация API для:
Авторизации/регистрации.
Управления книгами и библиотекой.
Синхронизации прогресса чтения.
Интеграция с DeepSeek для AI-фич.
🚀 Продолжение следует...
Спасибо за поддержку! 👍