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 для взаємодії з клієнтами, який приховує складність гібридної архітектури.

Цей підхід підходить для проєктів будь-якої складності, включно з інтернет-магазинами, вебзастосунками для медіа та платформами для аналізу великих даних.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ