Приходилось ли вам проектировать схемы данных для SQL и NoSQL баз данных?

Ответ

Да, проектировал схемы как для реляционных (SQL), так и для нереляционных (NoSQL) баз данных.

Для SQL (PostgreSQL/MySQL):

  1. Нормализация: Доведение схемы до 3NF для минимизации дублирования и обеспечения целостности.
  2. Типы данных: Выбор оптимальных типов (INT, VARCHAR(n), TIMESTAMPTZ, JSONB).
  3. Ограничения: Использование PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK и NOT NULL.
  4. Индексы: Создание 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):

  1. Денормализация: Проектирование схемы, ориентированной на паттерны чтения, часто с вложенными документами для уменьшения количества запросов.
  2. Embedding vs Referencing: Решение, когда встраивать дочерние документы, а когда ссылаться на отдельные коллекции.
  3. Индексы: Создание индексов для полей запросов, включая составные и текстовые индексы.

Пример 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
}

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