Уяви ситуацію. У тебе є інтернет-магазин. Ти хочеш використовувати SQL, щоб зберігати інформацію про транзакції та зв'язки між клієнтами, продуктами й замовленнями. Паралельно потрібно аналізувати поведінку користувачів — які сторінки вони відвідують, які продукти шукають? Обсяг таких даних величезний, з нього треба миттєво витягувати аналітику й зберігати в менш жорсткій структурі. Це ідеальна ситуація, де гібридний підхід стає природним рішенням.
Переваги гібридних систем:
- Баланс між структурою й гнучкістю: SQL справляється з транзакціями і строгими реляційними запитами, тоді як NoSQL дозволяє зберігати неструктуровані дані.
- Оптимізація під задачі: кожен тип бази даних використовується для того, в чому він найкращий — SQL для строгих зв'язків, NoSQL для аналізу великих обсягів даних.
- Масштабованість: 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 демонструє:
- Надійність для керованих транзакцій на рівні PostgreSQL.
- Гнучкість для масштабованих і динамічних даних на рівні MongoDB.
- Єдиний API для взаємодії з клієнтами, який приховує складність гібридної архітектури.
Цей підхід підходить для проєктів будь-якої складності, включно з інтернет-магазинами, вебзастосунками для медіа та платформами для аналізу великих даних.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ