Есть бд в которой есть две таблицы: продукты и страны. Продукты могут относится к одной или нескольким странам. Если бы продукт мог относится только к одной стране можно было бы в таблице products добавить столбец с названием id_country и добавлять в него id страны. Но как быть в случае когда продукт может относится к нескольким странам, как правильно создать нужную таблицу?
Для правильного вопроса надо знать половину ответа
Отношение Many-to-Many строится через промежуточную таблицу связи, поля которой ссылаются на две основные таблицы. products_countries (product_id, country_id)
Что бы можно было выводить не все категории если пользователь выберет определенную страну а только те категории в которых есть товары которые относятся к указанной стране?
Chesterfield25, это если товар в одной стране относится к одной категории, а в другой стране он относится к другой категории, и категория товара зависит от пары (товар,страна). Но если каждый товар относится только к одной категории независимо от страны, то отдельную таблицу со связью товар-категория нужно завести, а не скидывать всё в кучу.
CREATE TABLE IF NOT EXISTS `product_country` (
`product_id` int(11) NOT NULL,
`country_id` int(11) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `product_shop` (
`product_id` int(11) NOT NULL,
`shop_id` int(11) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `product_section` (
`product_id` int(11) NOT NULL,
`section_id` int(11) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `product_category` (
`product_id` int(11) NOT NULL,
`category_id` int(11) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `product_subcategory` (
`product_id` int(11) NOT NULL,
`subcategory_id` int(11) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
А у таблицы products удалить shop_id, country_id и subcategory_id?
Chesterfield25, не очень понятно, как соотносятся между собой таблицы. Например, если подкатегории принадлежат категориям, то отдельно хранить таблицу товар-категория не нужно, т.к. таблица товар-подкатегория будет включать в себя эту связь. Если каждый магазин принадлежит определённой стране, то тоже не нужно отдельной таблицы товар-страна, если есть таблица товар-магазин.
Одиночка Айс, Так какой вариант лучше подойдет для моего решения?
У меня есть таблица с странами далее таблица разделов, категорий относящихся к определенным разделам, подкатегорий относящихся к определенным категориям и таблица продуктов которая относится к определенной подкатегорие и одной, нескольким или всем странам. Для реализации изначально поставленного вопроса подойдет products_countries (product_id, country_id) данное решение. Ну как быть если после того как пользователь выберет определенную страну, в ней выводить не все разделы, категории и подкатегории а только те в которых есть продукты относящиеся к выбранной стране?
Попробуйте создать ещё одну таблицу, которая будет называться product_coutry
В ней должно быть только 2 поля product_id и country_id
Так и создаются связи M2M (ManyToMany)
Если правильно понимаю вот примерно то что мне нужно
1. База стран
CREATE TABLE IF NOT EXISTS `country` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(256) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
2. База магазинов
CREATE TABLE IF NOT EXISTS `shop` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(256) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
3. База product_id и country_id
CREATE TABLE IF NOT EXISTS `product_coutry` (
`product_id` varchar(256) NOT NULL,
`country_id` int(11) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
4. База разделов товаров
CREATE TABLE IF NOT EXISTS `sections` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(256) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
5. База категорий товаров, категория принадлежит определенному разделу
CREATE TABLE IF NOT EXISTS `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(256) NOT NULL,
`section_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
6. База подкатегорий товаров, подкатегория принадлежит определенной категорие
CREATE TABLE IF NOT EXISTS `subcategory` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(256) NOT NULL,
`category_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
7. База товаров
CREATE TABLE IF NOT EXISTS `products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(256) NOT NULL,
`description` varchar(256) NOT NULL,
`url` varchar(256) NOT NULL,
`price` double NOT NULL,
`shop_id` int(11) NOT NULL,
`created` datetime NOT NULL,
`modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Что бы можно было выводить не все категории если пользователь выберет определенную страну а только те категории в которых есть товары которые относятся к указанной стране?
Chesterfield25, лучше создать ещё одну таблицу, которая будет связывать категорию и продукт. Соответственно вы берете страну, через связь продукы, к которым прикреплены категории. Почитайте лучше информацию про OneToMany и ManyToMany, там подробно опишут про связи в базе данных.
CREATE TABLE IF NOT EXISTS `product_country` (
`product_id` int(11) NOT NULL,
`country_id` int(11) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `product_shop` (
`product_id` int(11) NOT NULL,
`shop_id` int(11) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `product_section` (
`product_id` int(11) NOT NULL,
`section_id` int(11) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `product_category` (
`product_id` int(11) NOT NULL,
`category_id` int(11) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `product_subcategory` (
`product_id` int(11) NOT NULL,
`subcategory_id` int(11) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
А у таблицы products удалить shop_id, country_id и subcategory_id?
Chesterfield25, Вы в вопросе OneToMany описали. Это когда у продукта есть ссылка на страну через county_id. Например одна страна имеет много продуктов, но продукт только одну страну.
Это если в кратце на пальцах обьяснять
Женя Ренессанс, А если нужно что бы и страна имела много продуктов и продукт имел много стран, в некоторых случаях это может быть и одна страна а в некоторых и все которые я укажу. Как тогда структурировать бд?