Для организации структуры базы данных интернет-магазина, который предлагает товары из разных источников и учитывает специфику каждого города, можно рассмотреть несколько важных аспектов. Исходя из ваших требований, можно предложить следующий подход к проектированию базы данных.
### Основные таблицы и их связи
1. **Таблица `city`**: содержит информацию о городах.
```sql
CREATE TABLE city (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
default_warehouse_id INT, -- id склада по умолчанию для этого города
UNIQUE(name)
);
```
2. **Таблица `product`**: совмещает общую информацию о товарах.
```sql
CREATE TABLE product (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
category VARCHAR(255),
images JSONB
);
```
3. **Таблица `product_price`**: хранит цену товара в зависимости от типа:
```sql
CREATE TABLE product_price (
id SERIAL PRIMARY KEY,
product_id INT REFERENCES product(id),
city_id INT REFERENCES city(id),
price NUMERIC(10, 2),
price_type VARCHAR(20) CHECK (price_type IN ('retail', 'partner', 'wholesale'))
);
```
4. **Таблица `warehouse`**: хранит информацию о складах.
```sql
CREATE TABLE warehouse (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
city_id INT REFERENCES city(id)
);
```
5. **Таблица `product_quantity`**: отслеживает остатки товара на складах.
```sql
CREATE TABLE product_quantity (
id SERIAL PRIMARY KEY,
product_id INT REFERENCES product(id),
warehouse_id INT REFERENCES warehouse(id),
quantity INT NOT NULL
);
```
### Логика работы
1. **Тип товара и цены**: Каждое значение цены будет связываться с определённым городом, что позволит вам иметь разные цены в зависимости от города. С полем `city_id` в таблице `product_price` вы сможете отделить цены для разных городов.
2. **Остатки товаров**: С помощью таблицы `product_quantity` вы сможете иметь количественные остатки товаров на разных складах, ассоциированных с конкретными городами. Основное различие здесь — это склад, на котором хранится товар.
3. **Отображение товара на сайте**: При запросе товаров на сайт можно будет легко фильтровать по `city_id`, чтобы отобразить товары, актуальные для выбранного города; в случае отсутствия товаров в базе для данного города, можно использовать товары из базы по умолчанию (например, по Москве).
### Дополнительные рекомендации
- Рассмотрите возможность создания таблицы для уникальных товаров, если они значительно отличаются от общих. Это может сократить место в таблице `product`, если уникальных товаров будет существенно меньше.
- Используйте индексы на ключевых полях для оптимизации производительности запросов.
- Храните фотографии товаров во внешнем хранилище (например, AWS S3) и сохраняйте ссылки в базе данных, чтобы уменьшить нагрузку на базу данных.
- Обеспечьте обработку версии базы данных для контроля изменений, функций и схемы.
Такой подход предоставит вам четкую и гибкую архитектуру для управления товарами и их наличием в зависимости от городов, в то же время учитывая более глубинные детали, такие как цены и остатки.