Лучший дизайн базы данных для продукта с различной ценой для каждого атрибута - PullRequest
8 голосов
/ 15 мая 2011

Каков лучший дизайн базы данных для следующей задачи:

У меня есть продукт с несколькими атрибутами, такими как цвет, размер, материал. В зависимости от этих атрибутов я хочу рассчитать общую стоимость продукта. Каждый атрибут может содержать определенную цену. Таким образом, цена продукта - это сумма всех затрат его атрибута.

Ответы [ 4 ]

9 голосов
/ 15 мая 2011

Первой идеей будет 3 таблицы

  • Продукт (название, описание и т. Д.)
  • Атрибут (цвет, размер, материал и т. Д.)
  • Много-много ссылокProductAttribute (productkey, attributekey, price)

Сумма по ProductAttribute per Product даст цену

Если у вас есть фиксированный и конечный набор атрибутов, то это могут быть отдельные столбцыв одной таблице продуктов с вычисляемым столбцом, чтобы сложить их.Тем не менее, я чувствую, что у вас есть переменное количество атрибутов для каждого продукта.Поэтому выведите его в отдельную таблицу.

Конечно, попробуйте не забиваться на территорию EAV ...: -)

Редактировать: после обновления вопроса

Я быиспользуйте Object Role Modeling для захвата модели, прежде чем я подумаю о реализации.

Факт или размер для цвета значительно изменяет дизайн

2 голосов
/ 15 мая 2011

Таблица PRODUCT со столбцами ID, BASEPRODUCTID, COLORID, SIZEID, MATERIALID, PRICE может показаться разумной. Таким образом, вы можете получить зеленый продукт X, но, возможно, продукт Y не будет доступен в зеленом цвете. Продукт Z может стоить значительно дороже, чем продукт X, поэтому сочетание цвета + цена, скорее всего, не имеет смысла - то же самое для других атрибутов.

BASEPRODUCT - это таблица, содержащая информацию о самом продукте - то есть название, описание и т. Д.

1 голос
/ 15 мая 2011

У вас есть базовая таблица ПРОДУКТОВ. В этой таблице вы можете указать базовую цену товара.

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

У вас есть таблица привязки, где ПРОДУКТ связан с одним или несколькими АТРИБУТАМИ. В этой таблице хранится цена дополнения атрибута.

Стоимость продукта - это его базовая цена плюс сумма цен его атрибута (ов). Стул = 100. Кожа = 75 апгрейд. Латунные гвозди = 25 улучшений. Кожаное кресло с латунными гвоздями = 200. Но вам не понадобятся медные гвозди, если у вас нет кожаного апгрейда. Так что кресло + латунные гвозди - не реальный вариант. Некоторые базы данных применяют такие правила в своей структуре. Другие делают это во фронтэнде. Это может стать довольно сложным.

Но эта структура из трех таблиц позволяет использовать несколько атрибутов для каждого продукта. Клиент может заказать базовый продукт или базовый продукт с одним или несколькими атрибутами, связанными с продуктом в вашей таблице PRODUCTATTRIBUTES.

Уникальные составные индексы в таблице PRODUCTATTRIBUTES (productid, attributeid) не позволят пользователю применять атрибут более одного раза: стул + кожа + кожа + латунные гвозди будут невозможны, и поэтому вы также запрещаете пользователю от того, что для одного и того же продукта обновление кожи стоит 100 в одном ряду и 125 в другом.

0 голосов
/ 15 мая 2011

Вы можете создать ProductMetadata для описания информации о продукте, такой как цвет, резкость и т. Д. PRODUCT - это продукт, который будет продаваться, продаваться и продаваться.Отношение между ProductMetadata и Product: ProductMetadata (one) <---> Product (many)

Product будет содержать эти поля:

  • ProductID
  • ProductMetadataID
  • ColorID
  • SizeID
  • MaterialID
  • Цена
  • Статус (продажа, продажа, продано и т. Д.)

Затем вы можете рассчитать то, что вы хотите, основываясь на соединительной таблице.

Если вы добавите еще какое-то поле в будущем, вы можете добавить поле Настройка для хранения описания XML продукта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...