Как спроектировать БД для работы с прайс листами поставщиков для интернет магазина?

251
07 февраля 2018, 10:44

Подскажите как правильно спроектировать БД интернет-магазина для работы с прайс листами от разных поставщиков ?

К примеру есть два поставщика (Поставщик_1 и Поставщик_2)
Ихние прайсы выглядают так:

Поставщик_1

|           |          |         |         Count           |
|    SKU    |    Brand |  Price  | Kiev  | Lviv | Vinnitsa |
|-----------|----------|---------|-------|------|----------|
| 335809    | KYB      | 2000.33 | 2     | 1    | 0        |
| N5524011G | NIPPARTS | 1096.40 | 3     | 1    | 0        |
| RC133     | GATES    |  181.18 | 5     | 2    | 0        |
| AL 104190 | ALKO     |  776.62 | 0     | 2    | 4        |
|           |          |         |       |      |          |

Поставщик_2 (Указывает цены в USD) и дает курс к грн (1USD = 28UAH)

|    SKU    |  Brands  | Price USD | Kiev_1 | Kiev_2 | Lviv | Vinnitsa |
|-----------|----------|-----------|--------|--------|------|----------|
|           |          |           |        |        |      |          |
| 335809    | KAYABA   |     71,89 |      1 |      8 |    1 |        2 |
| N5524011G | NIPPARTS |     38,93 |      1 |      3 |    1 |        0 |
| RC133     | GATES    |      6,29 |     11 |      0 |    2 |        7 |
| AL 104190 | AL-KO    |     27,75 |      7 |      2 |    2 |        1 |

Так как у разных поставщиков разные названия брендов, собрал базу псевдонимов

-- ----------------------------------
-- Бренды (Производители)
-- ----------------------------------
CREATE TABLE brands (
  id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(64),
  PRIMARY KEY (`id`),
  CONSTRAINT unique_brands_name UNIQUE (name)
) ENGINE=MyISAM;
-- Псевдонимы брендов
CREATE TABLE brands__aliases (
  id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  brands_id INT(10) UNSIGNED NOT NULL,
  name VARCHAR(100),
  PRIMARY KEY (`id`),
  CONSTRAINT unique_brands_and_aliases_name UNIQUE (brands_id,name),
  CONSTRAINT FK_brands_aliases_bid FOREIGN KEY (`brands_id`) REFERENCES brands(`id`)
) ENGINE=MyISAM;

Сайт с поддержкой мультиязычности, "Категории товаров:"

-- Мультиязычность
CREATE TABLE language (
  id TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(32) NOT NULL,
  iso_code CHAR(2) NOT NULL COMMENT 'ISO 639-1',
  status BOOLEAN DEFAULT TRUE, -- Отображаэмость на сайте
  PRIMARY KEY (`id`),
  CONSTRAINT unique_languages_iso_code UNIQUE (iso_code),
  CONSTRAINT unique_languages_name UNIQUE (name)
) ENGINE=MyISAM COMMENT='по стандарту ISO-639-1';
-- Категории товаров
-- Создаём структуру, дерева, какой оно является в режиме AL
CREATE TABLE category (
  id INT(10) UNSIGNED AUTO_INCREMENT,
  image VARCHAR(128) NULL DEFAULT NULL,
  top BOOLEAN DEFAULT FALSE COMMENT 'Популярная',
  status BOOLEAN DEFAULT TRUE COMMENT 'Отображаемый',
  parent_id INT(10) UNSIGNED NULL DEFAULT NULL COMMENT 'Номер родителя', -- Идентификатор родительского узла
  -- NS колонки (Nested Sets)
  left_key INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Левый ключ', -- Точка отсчета начала ветки
  right_key INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Правый ключ', -- Точка остановки конца ветки
  level INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Уровень', -- Уровень узла (Количество родителей узла)
  PRIMARY KEY (`id`),
  INDEX categoryp_idx (`parent_id`),
  INDEX categorylr_idx (left_key, right_key),
  CONSTRAINT FK_category_parent_id_id FOREIGN KEY (`parent_id`) REFERENCES category(`id`)
) ENGINE=MyISAM COMMENT='модель Nested Sets';
-- Мультиязычность категории
CREATE TABLE category__translation (
  category_id INT(10) UNSIGNED NOT NULL,
  language_id TINYINT(3) UNSIGNED NOT NULL,
  name VARCHAR(128) NOT NULL,
  description MEDIUMTEXT,
  meta_description VARCHAR(255),
  meta_keyword VARCHAR(255),
  PRIMARY KEY (`category_id`,`language_id`),
  INDEX category_name_idx (`name`),
  CONSTRAINT FK_category_сid FOREIGN KEY (`category_id`) REFERENCES category(`id`),
  CONSTRAINT FK_category_lid FOREIGN KEY (`language_id`) REFERENCES language(`id`)
) ENGINE=MyISAM;
-- Todo: сделать таблицу в которой будут хранится изображения

На сайте цена товара будет калькулироваться от цен поставщиков
(Самая низкая с прайсов цена + наша наценка)

Также один товар может находится в нескольких категориях:

-- -----------------------
-- Товары (Продукты)
-- -----------------------
-- Таблица с продуктами
CREATE TABLE product (
  id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  image VARCHAR(128) NULL DEFAULT NULL,
  price DECIMAL(13,6) NOT NULL,
  brand INT(10) UNSIGNED NOT NULL,
  SKU VARCHAR(64) NOT NULL COMMENT 'Артикул товара',
  PRIMARY KEY (`id`),
  INDEX product_brand_idx (mpn_number,brand),
  CONSTRAINT FK_product_brand_id FOREIGN KEY (`brand`) REFERENCES brands(`id`)
) ENGINE=MyISAM;

-- Связь (Товар - Категория)
CREATE TABLE product__category (
  product_id INT(10) UNSIGNED NOT NULL,
  category_id INT(10) UNSIGNED NOT NULL,
  PRIMARY KEY (`product_id`,`category_id`),
  CONSTRAINT FK_produc_category_pid FOREIGN KEY (`product_id`) REFERENCES product(`id`),
  CONSTRAINT FK_produc_category_cid FOREIGN KEY (`category_id`) REFERENCES category(`id`)
) ENGINE=MyISAM;

Вопрос:

  • Как спроектировать таблицы для работы с прайс листами, с сохранением даты и цен (Для будущей аналитики и постройки графиков цен и наличия)

Так-же буду очень рад услышать другие советы и рекомендации...

READ ALSO
Запрос не работает на веб сервере

Запрос не работает на веб сервере

Есть такой запрос в бд

203
Mysql Select и Update в том же table

Mysql Select и Update в том же table

Подскажите пожалуйста решение:

182
NullReferenceException С# При попытке заполнения

NullReferenceException С# При попытке заполнения

Возникла необычная проблемаИмеется класс:

186