Я довольно новичок в OOP / OOD, и я понимаю, что мне есть чему поучиться, поэтому я хотел бы попросить SO-сообщество поделиться их мнением.
По сути, я использую инфраструктуру CakePHP MVC, а созданный мной онлайн-магазин использует только две модели, Category и Product, описанные следующими операторами CREATE:
CREATE TABLE `categories` (
`id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(255) default NULL,
`parent_id` int(11) default NULL REFERENCES categories(`id`),
`lft` int(11) default NULL,
`rght` int(11) default NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `products` (
`id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(255) default NULL,
`artist_id` int(11) default NULL REFERENCES artists(`id`),
`description` text default NULL,
`category_id` int(11) default NULL REFERENCES categories(`id`),
`status` enum('in stock', 'pre-order', 'out of stock') NOT NULL,
`price` decimal(6,2) default NULL,
`picture` varchar(255) default NULL,
`picture2` varchar(255) default NULL,
PRIMARY KEY (`id`)
);
Интернет-магазин будет охватывать:
- Музыка
- Одежда
- Толстовки
- Футболки
- Тройники с длинными рукавами
- Эротические
- Головные уборы
- Разное Мерч
- наклейка
- Плакаты
- Сумки Tote
- Загрузки
- Мелодия
- 1047 * MP3 файлы *
По сути, это структура дерева категорий, хотя мы можем добавлять новые категории в будущем. В настоящее время все продукты обрабатываются одинаково как объекты класса Product, и их category_id является единственным способом различать различные типы продуктов. Интернет-магазин также является лишь одним разделом сайта. Остальная часть сайта содержит такую информацию, как биографии художников и дискографии; таким образом у меня также есть модели / таблицы для: Исполнитель , Альбом , Трек .
Это хороший подход? Или я должен создавать отдельные подклассы для компакт-дисков / футболок / MP3 / ..., которые наследуются от класса Product? Я хотел бы связать каждый музыкальный компакт-диск в магазине с записью дискографии, чтобы автоматически создавать списки треков и другую информацию для описания продукта.
Если это не очень хороший путь, как бы вы это сделали? Кроме того, какие методы / свойства я должен включить в свой класс Category / Product? И я должен только перечислять продукты в листовых узлах дерева категорий?
Редактировать:
Очевидно, этот дизайн является неполным. Как указал Кирилл, поле Product.price отсутствовало, и по-прежнему нет резервов для продаж. На самом деле я все еще пытаюсь понять, как лучше спроектировать и реализовать эти аспекты магазина. Скорее всего, у меня просто будет другая модель под названием Orders , но на самом деле обработка заказов усложняется тем, что мы применяем разные тарифы на доставку в зависимости от места назначения и того, что содержится в заказе.