← Назад к вопросам
Что такое база данных?
1.0 Junior🔥 171 комментариев
#Базы данных (NoSQL)#Базы данных (SQL)
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое база данных
База данных (БД) - это организованная система хранения и управления структурированными данными, обеспечивающая надежное сохранение, быстрый поиск и согласованность информации.
Основные характеристики
Ключевые свойства:
- Структурированность - данные организованы в таблицы, документы или другие структуры
- Персистентность - данные сохраняются на диск и остаются после перезагрузки
- Точка единственного источника истины - одна копия данных, все изменения в одном месте
- Управление доступом - контроль того, кто может читать и писать данные
- Защита от сбоев - резервные копии и восстановление после отказов
Типы баз данных
Реляционные (SQL):
import psycopg2
# PostgreSQL - самая популярная реляционная БД
conn = psycopg2.connect("dbname=mydb user=postgres")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE age > %s", (18,))
results = cursor.fetchall()
conn.close()
Данные организованы в таблицы с фиксированной схемой:
- Users (id, name, email, created_at)
- Orders (id, user_id, total, created_at)
Ключевые свойства: ACID, транзакции, join операции
NoSQL документные базы (MongoDB):
from pymongo import MongoClient
client = MongoClient(mongodb://localhost:27017/)
db = client.mydb
collection = db.users
# Документ хранится как JSON
user = {
"name": "John",
"email": "john@example.com",
"address": {
"city": "Moscow",
"zip": "12345"
}
}
collection.insert_one(user)
result = collection.find_one({"name": "John"})
Данные гибкие, без фиксированной схемы, масштабируются горизонтально
Key-Value хранилища (Redis):
import redis
r = redis.Redis(host=localhost, port=6379)
r.set(user:123:name, John) # Строка
r.set(user:123:age, 25) # Число
r.lpush(user:123:tags, developer) # Список
r.get(user:123:name) # Получить значение
Очень быстрые, хранят данные в памяти, используются для кеша
Time-series (InfluxDB, Prometheus):
# Для хранения метрик и временных рядов
# Пример: температура датчика каждую секунду
metrics = [
{"timestamp": "2024-01-01T10:00:00", "temperature": 23.5, "location": "room1"},
{"timestamp": "2024-01-01T10:00:01", "temperature": 23.6, "location": "room1"},
]
ACID свойства (Реляционные БД)
# Atomicity - все или ничего
try:
cursor.execute("UPDATE users SET balance = balance - 100 WHERE id = 1")
cursor.execute("UPDATE users SET balance = balance + 100 WHERE id = 2")
conn.commit() # Либо обе операции выполнены, либо откачены обе
except:
conn.rollback() # Откат при ошибке
# Consistency - данные остаются консистентными
# Есть constraints, triggers, которые это обеспечивают
# Isolation - транзакции не влияют друг на друга
# Levels: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE
# Durability - после commit, данные сохранены навсегда
Индексы для оптимизации
# Без индекса: SELECT * FROM users WHERE email = john@example.com
# Сканирует все 1 миллион строк
# С индексом:
# CREATE INDEX idx_email ON users(email)
# Находит за логарифмическое время
# В Python ORM:
from sqlalchemy import create_engine, Column, String, Index
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
email = Column(String, unique=True) # Автоматический индекс
__table_args__ = (
Index(idx_email, email), # Явный индекс
)
Когда какую БД использовать
| Задача | База данных | Причина |
|---|---|---|
| Веб-приложение с релациями | PostgreSQL | ACID, надежность, SQL |
| Высоконагруженный кеш | Redis | Скорость в памяти |
| Гибкие схемы, документы | MongoDB | Масштабируемость, гибкость |
| Аналитика, временные ряды | ClickHouse, InfluxDB | Оптимизация для чтения |
| Графы и связи | Neo4j | Специализация по графам |
Практические советы
- Нормализация - избегай дублирования данных
- Индексирование - индексируй столбцы в WHERE и JOIN
- Резервные копии - regular backups спасают жизнь
- Мониторинг - следи за производительностью запросов
- Масштабирование - репликация (master-slave) или шардинг