структура электронной коммерции для продуктов (MySQL)

0

Я рассматриваю, как структурировать мою базу данных MySQL в решении для электронной коммерции. Чтобы быть более конкретным, я рассматриваю структуру продукта.

Это те таблицы, которые я придумал до сих пор. Как вы думаете?

Объяснение структуры

Приложение является многоязычным. Поэтому таблица продуктов разбивается на 2 таблицы.

Если продукты имеют, например, 2 варианта (Small, Medium) будут вставлены в общей сложности 3 строки. Это связано с тем, что каждый вариант может иметь различную информацию для каждого варианта. Когда продукт отображается на веб-странице, продукт 1 будет показан с раскрывающимся ящиком с малым и средним. Продукт без вариантов, естественно, будет вставлять только 1 строку.


products
id  master  product_number
1   0       123
2   1       456
3   1       678

products_descriptions id product_id country_code image name description vat price 1 1 en-us image.jpg t-shirt Nice t-shirt 25 19.99 2 2 en-us image.jpg t-shirt Nice t-shirt 25 19.99 3 3 en-us image.jpg t-shirt Nice t-shirt 25 19.99

products_to_options product_id option_id 2 1 3 2

options id name 1 Small 2 Medium

Теги:
database
e-commerce
database-design

1 ответ

1
Лучший ответ

Таблица ваших продуктов - шизофреник, ее сущность иногда является продуктом, а иногда и вариантом. Это приводит к очень громоздкому поведению. Например, вам нужен вопрос "сколько у нас разных продуктов?" ответьте select count(*) from products, но здесь это дает неправильный ответ, чтобы получить правильный ответ, вы должны знать Magic Number 0 и запрос select count (*) from products where master=0. "Список всех продуктов и сколько вариантов у нас есть для каждого" - это еще один запрос, который должен быть простым, но теперь это не так. Существуют и другие аномалии, такие как тот факт, что первая строка в описаниях продуктов - это рубашка с ценой и рисунком, но не размер (размер хранится в вариантах, но у них есть цены и собственные изображения).

Ваша проблема звучит так, будто у вас есть продукты в двух контекстах: (1) что-то, что можно отобразить как элемент в вашем магазине, и (2) что-то, что может быть заказано вашим клиентом. (1), вероятно, имеет название "Хэллоуинская футболка" или так, и у него, вероятно, есть изображение, которое видит клиент. (2) - это то, что заказывает клиент, поэтому он имеет (1), но также вариант спецификации, такой как "маленький" или, возможно, цвет "красный". Вероятно, у вас тоже есть цена и order_id, поэтому ваш магазин может узнать, какой конкретный товар отправлен.

Вы должны дать каждому контексту сущность. Вот как я это сделаю

displayable_product
id   name
1    "Baseball Cap"
2    "T-Shirt"

orderable_product
id   d_product_id order_id  size    color   price
1    1            123               red      9.99
2    2            456       small           19.99
3    2            789       medium          21.99

displayable_content
id   d_product_id  locale  name                 image
1    1             en_US   "Baseball Cap"       baseballcap.jpg
2    1             es_US   "Gorra de Beisbol"   baseballcap.jpg
3    2             en_US   "Nice T-Shirt"       nicetshirt.jpg
4    2             es_US   "Camiseta"           nicetshirt.jpg

Вы должны использовать locale вместо country в таблицах отображения для учета стран с более чем одним языком (США, Швейцария и др.), и вы можете отделить size и color в его собственную таблицу variants. И если вам нужны данные, зависящие от страны, по заказу (например, разные цены/валюты для доставки в разные страны), вам также нужно будет извлечь также таблицу зависимых от страны orderable_content.

  • 0
    Интересный пример. Но что делать, если количество вариантов неизвестно? Нравится "Slewvless"? Вы должны это нормализовать?
  • 0
    Я бы постарался, чтобы база данных была нормализована как можно дольше. В вашем случае я бы попытался отсортировать варианты в два сегмента: (1) те, которые являются структурными в том смысле, что они могут оказаться в запросах типа «в этом году, сколько клиентов предпочли красный, если красный, белый и синий предлагается ", и (2) те, которые напоминают описание текста больше, чем категории. В идеале, ведро (2) должно быть пустым, но в реальной жизни я могу быть больше (1). Но в принципе, если что-то часто появляется в запросах, я хочу, чтобы это нормализовалось. Если он используется только в описаниях, то можно поместить его в таблицу EAV.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню