4

Создаю онлайн-сервис для чтения книг. День 1. Проектирование БД


Всем привет, хочу вам показать свои шаги по созданию онлайн сервиса для чтения книг.

Создаю онлайн-сервис для чтения книг. День 1. Проектирование БД Программирование, База данных, SQL, Длиннопост

🤔 Идея проекта

Создание платформы для удобного чтения книг в формате PDF с синхронизацией прогресса на всех устройствах.
Ключевые фичи:

  • Интерактивные элементы для работы с текстом (закладки, заметки).

  • Интеграция с ИИ (например, перевод и анализ текста через DeepSeek).

  • Персонализированные рекомендации.

👀 Начало работы: проектирование БД

Спроектирована структура базы данных для поддержки функционала сервиса.
Представлю функционал в виде use-case диаграммы.

Создаю онлайн-сервис для чтения книг. День 1. Проектирование БД Программирование, База данных, SQL, Длиннопост

Базовый функционал

Как видно по фотографии, есть 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 токена.

Создаю онлайн-сервис для чтения книг. День 1. Проектирование БД Программирование, База данных, SQL, Длиннопост

Таблица в Miro

С уверенностью 100% я могу сказать, что база данных будет меняться, но это будет на следующих этапах.

🔧 Следующие шаги

  1. Разработка сервера на .NET 7.0 для обработки HTTP-запросов.

  2. Реализация API для:

    • Авторизации/регистрации.

    • Управления книгами и библиотекой.

    • Синхронизации прогресса чтения.

  3. Интеграция с DeepSeek для AI-фич.


🚀 Продолжение следует...
Спасибо за поддержку! 👍