Структура базы данных MySQL для интернет-магазина - PullRequest
1 голос
/ 10 марта 2011

Я строю интернет-магазин, и у меня проблема. У меня будут продукты с прямой ценой (например, HTC Touch 2 Smartphone: $ 299,00), но в то же время у меня будут продукты с ценами на комбинации на основе спецификаций:

На этом изображении вы видите диаграмму базы данных, которая, я думаю, подойдет для продуктов с несколькими ценами: database diagram

ОСНОВНАЯ ПРОБЛЕМА: Так как это интернет-магазин, люди будут добавлять товары в корзину. Я думаю, что элементы, вставленные в корзину, должны быть из той же таблицы (в нашем случае это будет таблица [combinations], так как цены сохранены).

Вот некоторые данные для этих таблиц, просто чтобы быть более понятными:

[products]

productid   |   productName
1           |   Nike T-Shirt
2           |   HTC Touch 2 Smartphone

[specifications]

specId   |   productId   |   specName
1        |   1           |   Size
2        |   1           |   Color

[specvalues]

specValueId   |   specId   |   svValue
1             |   1        |   L
2             |   1        |   XL
3             |   2        |   white
4             |   2        |   blue
5             |   2        |   red

[combinations] (товары в корзину)

combinationId   |   price   |   description
1               |   10      |   White L Nike T-Shirt
2               |   15      |   White XL Nike T-Shirt
3               |   11      |   Blue L Nike T-Shirt
4               |   16      |   Blue XL Nike T-Shirt
5               |   18      |   Red XL Nike T-Shirt

[combinationParts]

nmid   |   combinationId   |   specValueId
1      |   1               |   1
2      |   1               |   3
3      |   2               |   2
4      |   2               |   3
5      |   3               |   1
1      |   3               |   4
2      |   4               |   2
3      |   4               |   4
4      |   5               |   2
5      |   5               |   5

Я надеюсь, что моя диаграмма и база данных имеют смысл :).

Таким образом, вопрос заключается в том, как я могу хранить продукты с единой ценой (смартфон HTC Touch 2), чтобы их можно было добавлять в корзину, как товары с несколькими ценами.

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

Вы ударили по гвоздю по голове, когда сказали: «Я думаю, что предметы, вставленные в корзину, должны быть из того же стола».

Телефон HTC должен присутствовать в таблице комбинаций, просто как одна комбинация. Используя приведенный выше пример, вставьте в таблицу комбинаций еще одну запись, например:

---------------+-------------+------------------------
combinationId  |     price   |  description
---------------+-------------+------------------------
6              |     299     |  Base Model
---------------+-------------+------------------------

Это решает непосредственную проблему и не имеет недостатков. Кроме того, когда ваш магазин растет, и HTC, возможно, выпускает новые модели с разным ценовым диапазоном, у вас уже есть структура базы данных, удовлетворяющая требованиям.

Например

---------------+-------------+------------------------
combinationId  |     price   |  description
---------------+-------------+------------------------
6              |     299     |  Base Model
7              |     349     |  Exclusive Edition
---------------+-------------+------------------------
0 голосов
/ 31 января 2017

Самое простое решение, на мой взгляд, состоит в том, чтобы дать смартфону всего ОДНУ запись технических характеристик с одной записью технических характеристик. Таким образом, вы можете сохранить свою структуру нетронутой для каждого типа записи продукта. Только не отображайте никакие выбираемые опции в представлении продукта, когда есть только одна опция.

0 голосов
/ 10 марта 2011

Возможно, вы захотите взглянуть на базу данных OpenCarts .. Она на самом деле хорошо справляется с этой задачей ...

По существу:

Создайте таблицы для: Продукты Параметры продукта (ваш«spcification») Значения опций продукта (ваши «specvalues»)

Каждый продукт будет указан в «Таблице продуктов» и будет иметь цену. В таблице «Product Options» вы, по сути, перечисляете различные «спецификации».к продукту ...
В таблице "Значения опций продукта" перечислены действительные параметры и изменение базовой цены (+/-) ...

. Для хранения выполненных заказов OpenCart имеет практически одинаковые значения.столы ... (с привязанным идентификатором заказа)

Недавно я отключил функцию корзины для регистрации игроков на турнир ...

Базовым «продуктом» является регистрация игрока - $ 25«Product_option» просто перечисляет «спецификацию» / «тип регистрации»

Для «типа регистрации» значения хранятся в таблице «product_option_value» ... Они могут иметьзарегистрируйтесь как pay or play & play (pay & play входит в мини-игры) Оплата - это просто вариант по умолчанию без изменения цены ... Pay and Play добавляет к цене 15 долларов (всего 40 долларов)

Я мог бы легко добавить к продукту несколько наборов «Product_options» и «product_option_value» ... Каждый из которых либо прибавляет, либо вычитает из продуктов с итоговым итогом ...

Что касается сценариев, то для этого требуется всего пара цикловзапросить и построить массив с массивом продуктов с опцией продукта в качестве подмассива продуктов и значений параметров продукта в качестве подмассива каждого массива опций продукта

Таблица 'product_option_value'

--
-- Table structure for table `product`
--

CREATE TABLE IF NOT EXISTS `product` (
  `product_id` int(11) NOT NULL auto_increment,
  `site_id` int(11) NOT NULL,
  `name` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL,
  `description` text character set utf8 collate utf8_unicode_ci NOT NULL,
  `price` decimal(15,2) NOT NULL default '0.00',
  `date_available` date NOT NULL,
  `date_unavailable` date NOT NULL,
  `status` int(1) NOT NULL default '0',
  `date_added` datetime NOT NULL default '0000-00-00 00:00:00',
  `date_modified` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`product_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=2 ;

--
-- Dumping data for table `product`
--

INSERT INTO `product` (`product_id`, `site_id`, `name`, `description`, `price`, `date_available`, `date_unavailable`, `status`, `date_added`, `date_modified`) VALUES
(1, 2, 'Player Registration', 'This year we have two options:  Pay or Pay &amp; Play.<br />Pay &amp; Play allows you to enroll in the Flights Minigames for the weekend (Master''s Marks and Flights Doubles) and gives you twenty dollars worth of prize raffles.  <br />Pay &amp; Play is a $60.00 value and is only avalible during pre-registration.', 25.00, '2011-03-01', '2011-03-31', 1, '2011-03-01 00:00:00', '2011-03-01 00:00:00');

-- --------------------------------------------------------

--
-- Table structure for table `product_option`
--

CREATE TABLE IF NOT EXISTS `product_option` (
  `product_option_id` int(11) NOT NULL auto_increment,
  `product_id` int(11) NOT NULL,
  `sort_order` int(3) NOT NULL default '0',
  `name` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`product_option_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=2 ;

--
-- Dumping data for table `product_option`
--

INSERT INTO `product_option` (`product_option_id`, `product_id`, `sort_order`, `name`) VALUES
(1, 1, 1, 'Registration Type');

-- --------------------------------------------------------

--
-- Table structure for table `product_option_value`
--

CREATE TABLE IF NOT EXISTS `product_option_value` (
  `product_option_value_id` int(11) NOT NULL auto_increment,
  `product_option_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `price` decimal(15,2) NOT NULL,
  `prefix` char(1) collate utf8_bin NOT NULL,
  `sort_order` int(3) NOT NULL,
  `name` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`product_option_value_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=3 ;

--
-- Dumping data for table `product_option_value`
--

INSERT INTO `product_option_value` (`product_option_value_id`, `product_option_id`, `product_id`, `price`, `prefix`, `sort_order`, `name`) VALUES
(1, 1, 1, 15.00, '+', 1, 'Pay &amp; Play'),
(2, 1, 1, 0.00, '', 2, 'Pay');
...