Ответ
Да, проектировал схемы как для реляционных (SQL), так и для нереляционных (NoSQL) баз данных.
Для SQL (PostgreSQL/MySQL):
- Нормализация: Доведение схемы до 3NF для минимизации дублирования и обеспечения целостности.
- Типы данных: Выбор оптимальных типов (
INT,VARCHAR(n),TIMESTAMPTZ,JSONB). - Ограничения: Использование
PRIMARY KEY,FOREIGN KEY,UNIQUE,CHECKиNOT NULL. - Индексы: Создание B-tree индексов для полей в условиях
WHERE,JOIN,ORDER BY. Для полнотекстового поиска — GIN индексы.
Пример SQL-схемы:
CREATE TABLE authors (
id SERIAL PRIMARY KEY,
name VARCHAR(200) NOT NULL
);
CREATE TABLE books (
id SERIAL PRIMARY KEY,
author_id INTEGER NOT NULL REFERENCES authors(id) ON DELETE CASCADE,
title VARCHAR(500) NOT NULL,
published_date DATE,
metadata JSONB -- Использование JSONB для гибких данных
);
CREATE INDEX idx_books_author_id ON books(author_id);
CREATE INDEX idx_books_title ON books(title);
Для NoSQL (MongoDB):
- Денормализация: Проектирование схемы, ориентированной на паттерны чтения, часто с вложенными документами для уменьшения количества запросов.
- Embedding vs Referencing: Решение, когда встраивать дочерние документы, а когда ссылаться на отдельные коллекции.
- Индексы: Создание индексов для полей запросов, включая составные и текстовые индексы.
Пример MongoDB-документа:
{
"_id": ObjectId("..."),
"order_id": "ORD-12345",
"customer": {
"name": "John Doe",
"email": "john@example.com"
},
"items": [
{ "product_id": 101, "quantity": 2, "price": 29.99 },
{ "product_id": 205, "quantity": 1, "price": 15.50 }
],
"total": 75.48
} Ответ 18+ 🔞
Да ты посмотри, какие мы тут архитекторы, блядь! Проектировал, сука, схемы и для SQL, и для NoSQL — вот это я понимаю, раздвоение личности, ёпта! Как будто в одной руке молоток, а в другой — кисточка, блядь.
Для этих ваших SQL (PostgreSQL/MySQL):
Тут, сука, главное — нормализовать всё до третьей нормальной формы, чтобы данные не повторялись, как заезженная пластинка. Выбираешь типы данных, как на рынке картошку — чтоб впритык, без переплаты за место. А потом навешиваешь ограничения — PRIMARY KEY, FOREIGN KEY — чтобы всё держалось, как гвоздями прибито. Ну и индексы, блядь, без них нихуя не быстро, особенно если искать по WHERE или JOIN делать.
Вот, смотри, как это выглядит, чтоб не пиздеть:
CREATE TABLE authors (
id SERIAL PRIMARY KEY,
name VARCHAR(200) NOT NULL
);
CREATE TABLE books (
id SERIAL PRIMARY KEY,
author_id INTEGER NOT NULL REFERENCES authors(id) ON DELETE CASCADE,
title VARCHAR(500) NOT NULL,
published_date DATE,
metadata JSONB -- А это для гибкости, чтоб не переделывать таблицу каждый раз, когда начальству приспичит
);
CREATE INDEX idx_books_author_id ON books(author_id);
CREATE INDEX idx_books_title ON books(title);
А для NoSQL (MongoDB) — тут вообще другой цирк, блядь: Тут не нормализуешь, а денормализуешь, как будто специально всё в кучу сгребаешь. Главное — подумать, как данные чаще всего читать будешь, и под это всё заточить. Решаешь, что встраивать в один документ, а на что отдельно ссылаться — это как решить, хранить ли носки в одном ящике с трусами или разложить по полочкам, блядь.
Вот тебе документик для примера, чтоб понятно было:
{
"_id": ObjectId("..."),
"order_id": "ORD-12345",
"customer": {
"name": "John Doe",
"email": "john@example.com"
},
"items": [
{ "product_id": 101, "quantity": 2, "price": 29.99 },
{ "product_id": 205, "quantity": 1, "price": 15.50 }
],
"total": 75.48
}
Вот и вся разница, ебать мои старые костыли. В одном случае — строгий порядок, как в армии, а в другом — творческий беспорядок, как в мастерской художника. Главное — не перепутать, а то получится пиздец, а не схема.