Проектирование базы данных для веб-сайта, предоставляющего товары и услуги, включает в себя создание нескольких взаимосвязанных таблиц. Основная цель – обеспечить эффективное хранение и доступ к данным, поддерживая при этом масштабируемость и производительность системы.
Таблица | Описание |
---|---|
categories |
Хранит основные категории товаров и услуг, а также их подкатегории. |
subcategories |
Содержит подкатегории, связанные с основными категориями. |
products |
Управляет информацией о товарах, включая названия, описания, цены и фотографии. |
services |
Содержит данные об услугах, включая краткие и полные описания, а также фотографии. |
projects |
Хранит примеры проектов, связанных с предоставляемыми услугами. |
orders |
Фиксирует информацию о заказах пользователей, включая детали заказа и контактную информацию. |
contacts |
Обрабатывает сообщения от пользователей через форму "Связаться с нами". |
categories
Таблица categories
служит для хранения основных категорий, а также подкатегорий товаров и услуг.
id
(SERIAL, PRIMARY KEY) – уникальный идентификатор категории.name
(VARCHAR(255), NOT NULL) – название категории.description
(TEXT) – описание категории (опционально).parent_id
(INTEGER, FOREIGN KEY) – ссылка на родительскую категорию для подкатегорий.categories
:
CREATE TABLE categories (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
parent_id INTEGER,
FOREIGN KEY (parent_id) REFERENCES categories(id) ON DELETE SET NULL
);
subcategories
Таблица subcategories
содержит подкатегории, связанные с основными категориями.
id
(SERIAL, PRIMARY KEY) – уникальный идентификатор подкатегории.category_id
(INTEGER, FOREIGN KEY, NOT NULL) – ссылка на основную категорию.name
(VARCHAR(255), NOT NULL) – название подкатегории.description
(TEXT) – описание подкатегории (опционально).subcategories
:
CREATE TABLE subcategories (
id SERIAL PRIMARY KEY,
category_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
description TEXT,
FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE CASCADE
);
products
Таблица products
управляет информацией о товарах, включая названия, описания, цены и фотографии.
id
(SERIAL, PRIMARY KEY) – уникальный идентификатор товара.subcategory_id
(INTEGER, FOREIGN KEY, NOT NULL) – ссылка на подкатегорию.name
(VARCHAR(255), NOT NULL) – название товара.description
(TEXT) – подробное описание товара.price
(NUMERIC(10, 2), NOT NULL) – цена товара.photo_url
(VARCHAR(255)) – ссылка на фотографию товара.created_at
(TIMESTAMP, DEFAULT CURRENT_TIMESTAMP) – дата и время добавления товара.products
:
CREATE TABLE products (
id SERIAL PRIMARY KEY,
subcategory_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
description TEXT,
price NUMERIC(10, 2) NOT NULL,
photo_url VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (subcategory_id) REFERENCES subcategories(id) ON DELETE SET NULL
);
services
Таблица services
содержит данные об услугах, включая краткие и полные описания, а также фотографии.
id
(SERIAL, PRIMARY KEY) – уникальный идентификатор услуги.subcategory_id
(INTEGER, FOREIGN KEY, NOT NULL) – ссылка на подкатегорию.name
(VARCHAR(255), NOT NULL) – название услуги.short_description
(TEXT) – краткое описание услуги.description
(TEXT) – полное описание услуги.photo_url
(VARCHAR(255)) – ссылка на фотографию услуги.created_at
(TIMESTAMP, DEFAULT CURRENT_TIMESTAMP) – дата и время добавления услуги.services
:
CREATE TABLE services (
id SERIAL PRIMARY KEY,
subcategory_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
short_description TEXT,
description TEXT,
photo_url VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (subcategory_id) REFERENCES subcategories(id) ON DELETE SET NULL
);
projects
Таблица projects
хранит примеры проектов, связанных с предоставляемыми услугами.
id
(SERIAL, PRIMARY KEY) – уникальный идентификатор проекта.service_id
(INTEGER, FOREIGN KEY, NOT NULL) – ссылка на услугу.name
(VARCHAR(255), NOT NULL) – название проекта.short_description
(TEXT) – краткое описание проекта.description
(TEXT) – подробное описание проекта.photo_url
(VARCHAR(255)) – ссылка на фотографию проекта.created_at
(TIMESTAMP, DEFAULT CURRENT_TIMESTAMP) – дата и время добавления проекта.projects
:
CREATE TABLE projects (
id SERIAL PRIMARY KEY,
service_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
short_description TEXT,
description TEXT,
photo_url VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE
);
orders
Таблица orders
фиксирует информацию о заказах пользователей, включая детали заказа и контактные данные.
id
(SERIAL, PRIMARY KEY) – уникальный идентификатор заказа.product_id
(INTEGER, FOREIGN KEY) – ссылка на товар (если заказ связан с товаром).service_id
(INTEGER, FOREIGN KEY) – ссылка на услугу (если заказ связан с услугой).customer_name
(VARCHAR(255), NOT NULL) – имя заказчика.customer_email
(VARCHAR(255), NOT NULL) – email заказчика.customer_phone
(VARCHAR(20)) – телефон заказчика.order_date
(TIMESTAMP, DEFAULT CURRENT_TIMESTAMP) – дата и время заказа.status
(VARCHAR(50), DEFAULT 'В обработке') – статус заказа.orders
:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
product_id INTEGER,
service_id INTEGER,
customer_name VARCHAR(255) NOT NULL,
customer_email VARCHAR(255) NOT NULL,
customer_phone VARCHAR(20),
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
status VARCHAR(50) DEFAULT 'В обработке',
FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE SET NULL,
FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE SET NULL
);
contacts
Таблица contacts
обрабатывает сообщения от пользователей через форму "Связаться с нами".
id
(SERIAL, PRIMARY KEY) – уникальный идентификатор сообщения.name
(VARCHAR(255), NOT NULL) – имя контактного лица.email
(VARCHAR(255), NOT NULL) – email для связи.phone
(VARCHAR(20)) – телефон для связи.message
(TEXT, NOT NULL) – сообщение от пользователя.created_at
(TIMESTAMP, DEFAULT CURRENT_TIMESTAMP) – дата и время создания сообщения.contacts
:
CREATE TABLE contacts (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
phone VARCHAR(20),
message TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Для создания основной категории "Электроника" и подкатегории "Смартфоны" выполните следующие SQL-запросы:
-- Добавление основной категории
INSERT INTO categories (name, description) VALUES ('Электроника', 'Категория товаров электронной техники.');
-- Добавление подкатегории
INSERT INTO subcategories (category_id, name, description) VALUES (1, 'Смартфоны', 'Различные модели смартфонов.');
Для добавления товара "iPhone 13" в подкатегорию "Смартфоны" используйте следующий запрос:
INSERT INTO products (subcategory_id, name, description, price, photo_url)
VALUES (1, 'iPhone 13', 'Новый смартфон Apple с улучшенной камерой.', 999.99, 'iphone13.jpg');
Для добавления услуги "Разработка сайтов" и примера проекта "Корпоративный сайт компании" выполните следующие действия:
-- Добавление услуги
INSERT INTO services (subcategory_id, name, short_description, description, photo_url)
VALUES (NULL, 'Разработка сайтов', 'Создание профессиональных сайтов', 'Мы предлагаем полный цикл разработки сайтов для бизнеса.', 'webdev.jpg');
-- Добавление примера проекта
INSERT INTO projects (service_id, name, short_description, description, photo_url)
VALUES (1, 'Корпоративный сайт компании', 'Сайт с индивидуальным дизайном', 'Разработка корпоративного сайта с уникальным дизайном и функционалом.', 'project1.jpg');
category_id
, service_id
и product_id
, чтобы ускорить выборку данных.Для обновления статуса заказа, например, из "В обработке" в "Завершен", используйте следующий запрос:
UPDATE orders
SET status = 'Завершен'
WHERE id = 1;
Для получения списка всех товаров в категории "Смартфоны", выполните следующий запрос:
SELECT p.id, p.name, p.description, p.price, p.photo_url
FROM products p
JOIN subcategories sc ON p.subcategory_id = sc.id
JOIN categories c ON sc.category_id = c.id
WHERE c.name = 'Электроника' AND sc.name = 'Смартфоны';
Для получения всех проектов, связанных с услугой "Разработка сайтов", используйте следующий запрос:
SELECT pr.id, pr.name, pr.short_description, pr.description, pr.photo_url
FROM projects pr
JOIN services s ON pr.service_id = s.id
WHERE s.name = 'Разработка сайтов';
Проектирование базы данных для веб-сайта, предоставляющего товары и услуги, требует тщательного подхода к структуре данных и их взаимосвязям. Иерархическая организация категорий, эффективное управление товарами и услугами, а также возможность обработки заказов и коммуникации с пользователями являются ключевыми аспектами успешной реализации. Следование рекомендациям по оптимизации и безопасности обеспечит надежную и масштабируемую систему, способную удовлетворить потребности как бизнеса, так и его клиентов.