JavaRush /Курсы /Модуль 4: FastAPI /Управление данными в реляционных и нереляционных базах

Управление данными в реляционных и нереляционных базах

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

Сегодня мы погрузимся глубже в управление данными в реляционных и нереляционных базах: как оптимально создавать структуры, управлять запросами, работать с индексами и конфигурациями, а также обеспечивать безопасность и производительность. Приготовьтесь, это будет насыщенный материал с множеством практических примеров!

Когда мы говорим о реляционных базах данных, таких как PostgreSQL, основа основ — это таблицы и их структура. В этом разделе мы поймем, как эффективно управлять таблицами, создавать индексы для ускорения запросов, обеспечивать безопасность и проверять производительность.

Простейший способ описать структуру данных в SQL — это создать таблицу. Например, вот как создать таблицу users для нашего приложения:


CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  • SERIAL автоматически увеличивает идентификатор для каждой новой записи.
  • VARCHAR позволяет задать строковый тип с ограничением длины.
  • UNIQUE запрещает дублирование значений в указанном поле.
  • DEFAULT CURRENT_TIMESTAMP автоматически проставляет текущую дату и время.

Мы упустили важное поле — дату последнего обновления. Что делать? Конечно же, добавить его с помощью команды ALTER TABLE:


ALTER TABLE users ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;

Теперь у нас есть возможность отслеживать, когда пользовательские данные изменялись последний раз.

Индексация для ускорения запросов

Представьте, что вы ищете книгу в библиотеке, в которой миллион томов, но у вас нет каталога. Поиск займет вечность! Индексы — это каталоги для нашей базы данных. Создадим индекс для поля email в таблице users:


CREATE INDEX idx_users_email ON users(email);

Теперь запросы на поиск пользователя по email выполняются значительно быстрее.

💡 Совет:

Индексы — палка о двух концах. Они ускоряют чтение данных, но могут замедлить операции записи. Используйте их с умом и только для часто используемых ключей.

Контроль доступа и безопасность

Безопасность особенно важна для SQL баз, так как они часто содержат чувствительные данные. Например, мы можем ограничить доступ к таблице на уровне роли:


GRANT SELECT, INSERT ON users TO read_only_user;
REVOKE UPDATE, DELETE ON users FROM read_only_user;

Так мы даём пользователю read_only_user право только на чтение и добавление записей, запрещая изменение и удаление.


Основы управления данными в NoSQL

В мире NoSQL всё устроено не так, как в SQL. Здесь у нас нет таблиц с фиксированными полями, зато есть гибкость: коллекции и документы. Рассмотрим MongoDB как пример.

Коллекции — это нечто вроде таблиц, только без заранее определённой схемы. А документы внутри коллекций — это записи в формате JSON. Вот пример добавления документа в коллекцию products через MongoDB:


product = {
    "name": "Super Widget",
    "price": 49.99,
    "stock": 120,
    "tags": ["gadget", "widget", "electronics"],
    "created_at": datetime.now()
}
db.products.insert_one(product)

Теперь у нас есть запись, и всё это без предварительного определения структуры.

Допустим, наш товар подорожал, и мы хотим обновить его цену:


db.products.update_one(
    {"name": "Super Widget"},  # Условие поиска
    {"$set": {"price": 59.99}} # Новое значение
)

Гибкость JSON позволяет добавлять новые поля на лету. Например, мы можем добавить поле category, если его раньше не было:


db.products.update_one(
    {"name": "Super Widget"},
    {"$set": {"category": "tools"}}
)

Индексация и производительность

Как и в SQL базах, индексы в MongoDB увеличивают скорость поиска. Создадим индекс для поля price:


db.products.create_index("price")

Теперь запросы, ищущие товары в определённом ценовом диапазоне, выполняются быстрее.

⚠️ Обратите внимание:

что индексы занимают память. Чем больше индексов, тем выше потребление ресурсов.


Примеры успешного управления данными в гибридных архитектурах

Когда вы работаете с гибридными проектами, объединяющими SQL и NoSQL, управление данными становится одновременно вызовом и искусством.

Например, представьте интернет-магазин, где SQL используется для транзакций, а NoSQL — для аналитики. В SQL-базе мы храним данные о заказах:


CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    user_id INT NOT NULL,
    total_amount NUMERIC(10, 2) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

В NoSQL (MongoDB) мы записываем аналитику поведения пользователя:


analytics_doc = {
    "user_id": 42,
    "page_views": [
        {"page": "/home", "timestamp": datetime(2023, 11, 1, 10, 15)},
        {"page": "/product/12", "timestamp": datetime(2023, 11, 1, 10, 18)}
    ],
    "session_id": "abc123"
}
db.analytics.insert_one(analytics_doc)

Поток данных между двумя системами

Иногда данные из NoSQL базы нужно анализировать в SQL. Например, мы можем извлекать наиболее посещаемые страницы из MongoDB и переносить эти данные в PostgreSQL для построения отчетов.

Python-код для синхронизации:


# Извлекаем из MongoDB
top_pages = db.analytics.aggregate([
    {"$unwind": "$page_views"},
    {"$group": {"_id": "$page_views.page", "views": {"$sum": 1}}},
    {"$sort": {"views": -1}}
])

# Сохраняем в PostgreSQL
for page in top_pages:
    cursor.execute("""
        INSERT INTO page_views (page, views)
        VALUES (%s, %s)
        ON CONFLICT (page) DO UPDATE SET views = excluded.views;
    """, (page["_id"], page["views"]))
    conn.commit()

Это позволяет реализовать мощную аналитику.


Заключительные советы и лучшие практики

Работа с SQL и NoSQL требует знания их сильных сторон и умения использовать их одновременно. Вот несколько советов:

  • Оптимизируйте запросы: используйте индексы и профилирование запросов.
  • Защитите данные: В SQL — контроль доступа, в NoSQL — управление кластером.
  • Автоматизируйте синхронизацию данных: используйте инструменты ETL (Extract, Transform, Load) для переноса данных между базами.

Следуя этим принципам, вы сможете построить стабильную и производительную систему управления данными, которая будет соответствовать требованиям даже самого сложного проекта.

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