CREATE TABLE Product (ProductID int, Description nvarchar(100)) CREATE TABLE CategoryID (CategoryID int, Description nvarchar(100),ProductID int) CREATE TABLE SubCategoryID (SubCategoryID int, CategoryID int, Description nvarchar(100),ProductID int) CREATE TABLE ThemeID (ThemeID int, Description nvarchar(100),ProductID int)
Я использую Laravel ORM
Product hasMany-> Category Product hasMany-> SubCategory Product hasMany-> Theme Category BelongsTo->Product SubCategory BelongsTo->Category Theme BelongsTo -> Product
Каждый элемент имеет тему и относится к нескольким категориям, подкатегория является необязательной.
Любые советы по этому дизайну? Заранее спасибо!
Это лучшая практика? Попытка начать право
Позвольте показать вам идею, которая ИМХО, я думаю, что это хорошо для использования: сначала создайте таблицу категорий:
CREATE TABLE `category` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `category_father_id` int(11) DEFAULT '0', `is_active` tinyint(1) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`), KEY `category_father_id` (`category_father_id`), CONSTRAINT `constraint_name` FOREIGN KEY (`category_father_id`) REFERENCES `category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB;
то для вашей таблицы продуктов вы можете сохранить ее как есть:
CREATE TABLE Product (ProductID int, Description nvarchar(100));
Теперь обычно вы можете иметь Продукт, который относится к нескольким категориям. Следовательно, правильный способ сделать это – иметь отношение m: n между Продуктом и Категорией. и это можно сделать, добавив:
create table product_category( ProductId int(11) not null, CategoryId int(11) not null, unique (ProductId,CategoryId), foreign key (ProductId) references Product (ProductID) on update cascade on delete cascade, foreign key (CategoryId) references category (id) on update cascade on delete cascade )engine=innodb;
и вы можете сохранить тему как есть.
вы увидите, что таблица category
может обрабатывать категории вложенности с использованием внешнего ключа category_father_id
.
Но примечание, которое следует иметь в виду, в конце концов, всегда связано с вашей областью / бизнес-логикой.