Обобщение+история цен

Предположим, у меня есть продукт, который состоит из 3 основных элементов. Товаром является Ноутбук, а элементами являются: винты (id, код, описание) кнопки (id, код, описание) покрытие (id, код, описание, цвет).

Каждый ноутбук состоит из любой комбинации этих элементов.

  1. Я могу поместить все в одну таблицу «Материалы» и добавить атрибут под названием «тип», чтобы различать каждый элемент, но тогда будет много строк с пустыми значениями «цвета».

    Я думал о специализации: материалы (id, код, описание), а потом все это подклассы. Но тогда классы кнопок и винтов ничем не отличаются от материнского класса.

    Итак, каковы ваши идеи?

  2. Я хочу добавить атрибут цены за единицу. Мне нужна фактическая цена, и я хочу ежемесячно вести историю старых цен (т. е. каждая цена привязана к ММ/ГГГГ).

    Я могу создать таблицу цен:

    prices (id, price, date)
    

    Но должен ли я хранить актуальную = текущую цену в таблице материалов или просто в таблице цен?


person Miracle    schedule 04.03.2013    source источник


Ответы (1)


/* keep your general product specs here: */
PRODUCT
id primary key
type
code
description
standard_price


/* or add a subtype table for some of them: */
COVERAGE_PRODUCT
id pk fk PRODUCT
colour 


/* products are composed of other products: */
PRODUCT_STRUCTURE
part_of not null references product(id),
composed_of not null references product(id)
primary key (part_of, composed_of)

Вы можете сохранить исторические цены в своем хранилище данных или добавить таблицу product_price. в этом случае удалите из товара "standard_price".

PRODUCT_PRICE
product_id fk product(id)
from_date
price
to_date (nullable)
primary key (product_id, from_date)
person Neil McGuigan    schedule 04.03.2013
comment
Спасибо за помощь 1. Вы добавили новый атрибут под названием тип (я думаю, это будут либо винты, либо кнопки, либо покрытие). Разве это не должно идти в свою собственную таблицу? 2. Зачем нужны /* продукты, состоящие из других продуктов: */ PRODUCT_STRUCTURE? - person Miracle; 05.03.2013
comment
Зависит от того, хотите ли вы использовать наследование одной таблицы (использует нули, но проще) или наследование таблицы классов (без нулей, но более сложно). Продукт может состоять из других продуктов. Например, скейтборд состоит из доски, тележки и колес. В некоторых случаях это сетевая структура, а не иерархическая, отсюда и дизайн этой таблицы. - person Neil McGuigan; 05.03.2013
comment
так можно ли иметь несколько пустых значений для некоторых атрибутов в таблице? - person Miracle; 06.03.2013
comment
тебе решать. это подход, рекомендованный Мартином Фаулером, который знает все. - person Neil McGuigan; 06.03.2013