JavaRush /Курсы /Модуль 4: FastAPI /Примеры гибридных систем: использование SQL и NoSQL в одн...

Примеры гибридных систем: использование SQL и NoSQL в одном проекте

Модуль 4: FastAPI
10 уровень , 3 лекция
Открыта

Представьте себе ситуацию. У вас есть интернет-магазин. Вы хотите использовать SQL, чтобы хранить информацию о транзакциях и взаимосвязях между клиентами, продуктами и заказами. Вместе с этим, вам нужно анализировать пользовательское поведение — какие страницы они посещают, какие продукты ищут? Этот объем данных огромен, с него надо мгновенно «добывать» аналитику и хранить в менее строгой структуре. Это идеальная ситуация, где гибридный подход становится естественным решением.

Преимущества гибридных систем:

  1. Баланс между структурой и гибкостью: SQL справляется с транзакциями и строгими реляционными запросами, в то время как NoSQL позволяет хранить неструктурированные данные.
  2. Оптимизация под задачи: каждый тип базы данных используется для того, в чем он хорош — SQL для строгих связей, NoSQL для анализа больших объемов данных.
  3. Масштабируемость: NoSQL поддерживает горизонтальное масштабирование, а SQL остается основой для ACID-транзакций.

Как организовать гибридную систему?

Шаг 1: Выберите правильные базы данных.

Чтобы построить гибридную систему, важно выбрать базы данных, которые дополняют друг друга. В этой лекции мы рассмотрим связку PostgreSQL (SQL) и MongoDB (NoSQL). PostgreSQL обеспечит надежные транзакции для критически важных данных, а MongoDB позволит эффективно обрабатывать неструктурированные данные.

Шаг 2: Архитектура взаимодействия.

Типичная архитектура гибридного приложения может выглядеть так:

  • PostgreSQL: содержит таблицы для транзакций, пользователей и продуктов. Эти данные взаимодействуют через строгие связи (например, ForeignKey).
  • MongoDB: хранит логи, аналитику поведения пользователей или JSON-документы с данными о сеансах.

Шаг 3: Причисление данных к "SQL" или "NoSQL"

  • SQL: когда важны строгие связи, транзакции или сложные запросы (например, анализ заказов по категориям).
  • NoSQL: когда данные могут быть неструктурированы, постоянно изменяются или не требуют строгой консистентности (например, кликстримы пользователей).

Пример: интернет-магазин с PostgreSQL и MongoDB

Давайте построим простой проект: комбинированную систему интернет-магазина, где SQL обрабатывает транзакции, а NoSQL — логи посещений сайта.

Установка MongoDB


# Установка MongoDB на локальный сервер
sudo apt-get install -y mongodb
sudo systemctl start mongodb
sudo systemctl enable mongodb

Установка PostgreSQL


# Установка PostgreSQL
sudo apt-get update
sudo apt-get install postgresql postgresql-contrib
sudo service postgresql start

Реализация гибридной системы

Создадим приложение на основе FastAPI. Логика будет следующая:

  • PostgreSQL используется для хранения данных пользователей, продуктов и заказов.
  • MongoDB собирает и хранит логи пользовательских действий.

Установка библиотек


pip install fastapi[all] sqlalchemy psycopg2 motor pydantic

Конфигурация подключения

Создайте базу данных и таблицы.


-- Создание базы данных
CREATE DATABASE shop;

-- Создание таблицы пользователей
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL
);

-- Создание таблицы заказов
CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    user_id INTEGER REFERENCES users(id),
    total_amount NUMERIC
);

MongoDB не требует предварительного создания базы данных. Она создается автоматически при первом использовании.


Настройка приложения FastAPI


from fastapi import FastAPI
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, Numeric
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from motor.motor_asyncio import AsyncIOMotorClient
from pydantic import BaseModel

# Создание приложения FastAPI
app = FastAPI()

# Подключение к PostgreSQL
DATABASE_URL = "postgresql://user:password@localhost/shop"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

# Подключение к MongoDB
client = AsyncIOMotorClient("mongodb://localhost:27017")
mongo_db = client.shop_logs

# Модели PostgreSQL
class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, nullable=False)
    email = Column(String, unique=True, nullable=False)

class Order(Base):
    __tablename__ = "orders"
    id = Column(Integer, primary_key=True, index=True)
    user_id = Column(Integer, ForeignKey("users.id"))
    total_amount = Column(Numeric)

# Pydantic-схемы
class UserCreate(BaseModel):
    name: str
    email: str

class LogEntry(BaseModel):
    user_id: int
    action: str

Добавим CRUD для работы с пользователями и заказами.


@app.post("/users/")
def create_user(user: UserCreate, db: SessionLocal = Depends()):
    user_instance = User(name=user.name, email=user.email)
    db.add(user_instance)
    db.commit()
    db.refresh(user_instance)
    return user_instance

@app.get("/orders/")
def list_orders(db: SessionLocal = Depends()):
    return db.query(Order).all()

Сохраним действия пользователей в MongoDB.


@app.post("/log/")
async def create_log_entry(log_entry: LogEntry):
    log_document = log_entry.dict()
    result = await mongo_db.actions.insert_one(log_document)
    return {"log_id": str(result.inserted_id)}

@app.get("/log/")
async def get_logs():
    cursor = mongo_db.actions.find()
    logs = await cursor.to_list(length=100)
    return logs

Решение типичных вопросов при интеграции

Синхронизация данных

Если пользователь зарегистрировался в PostgreSQL, а его действия сохраняются в MongoDB, то синхронизация данных может стать проблемой. Чтобы этого избежать:

  • Используйте уникальные идентификаторы (UUID) для связи между системами.
  • Разрабатывайте очередь задач, чтобы данные, которые не успели записаться в MongoDB, синхронизировались позже.

Мониторинг производительности

MongoDB подходит для логов и анализа в реальном времени, поэтому важно избегать чрезмерного потребления ресурсов. Используйте индексы для больших коллекций.


Преимущества гибридного подхода на практике

Предлагаемая интеграция PostgreSQL и MongoDB демонстрирует:

  1. Надёжность для управляемых транзакций на уровне PostgreSQL.
  2. Гибкость для масштабируемых и динамических данных на уровне MongoDB.
  3. Единый API для взаимодействия с клиентами, который скрывает сложность гибридной архитектуры.

Этот подход подходит для проектов любой сложности, включая интернет-магазины, веб-приложения для медиа и платформы для анализа больших данных.

1
Задача
Модуль 4: FastAPI, 10 уровень, 3 лекция
Недоступна
Интеграция SQL и NoSQL через FastAPI
Интеграция SQL и NoSQL через FastAPI
1
Задача
Модуль 4: FastAPI, 10 уровень, 3 лекция
Недоступна
Взаимодействие и поиск данных в гибридной системе
Взаимодействие и поиск данных в гибридной системе
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ