сценарий проектирования базы данных

Как правильно это сделать:

У меня есть следующие отношения между сущностями RAW_MATERIAL_PRODUCT и FINISHED_PRODUCT: ГОТОВЫЙ ПРОДУКТ должен быть изготовлен из одного или нескольких продуктов сырья, а продукт сырья может быть частью готового продукта (так много-много). У меня есть объект пересечения, который я назвал СБОРКА, который точно говорит мне о том, из чего Сырье является Готовым Продуктом.

Хорошо. Теперь мне нужно продать готовую продукцию и рассчитать себестоимость. Появляется объект PRODUCT_OUT, который может содержать только один FINISHED PRODUCT, а FINISHED PRODUCT может быть частью нескольких PRODUCT_OUT.

Было бы легко, если бы, например, Готовый Продукт А всегда состоял из 3 частей Сырьевого Продукта а1, 2 из а2 и т. д. Проблема в том, что количества могут меняться.

Запас сырьевого продукта рассчитывается как

      TotalIn - TotalOut

поэтому я не могу поместить атрибут quantity в ASSEMBLY, потому что я получу неверные данные при расчете Stock. (если количество изменено)

Моя единственная идея состоит в том, чтобы отказаться от сущности FINISHED_PRODUCT и сделать соединение между PRODUCT_OUT и RAW_MATERIAL_PRODUCT с сущностью пересечения, содержащей атрибут количества. Но это кажется глупым, потому что почти всегда ГОТОВЫЕ_ПРОДУКТЫ изготавливаются из одних и тех же СЫРЬИХ_МАТЕРИАЛОВ_ПРОДУКТОВ.

Есть ли способ лучше?


person Dan Dinu    schedule 10.10.2011    source источник


Ответы (1)


Я не уверен на 100%, что понимаю, но похоже, что рецепт может измениться, и ваша модель должна учитывать это?

Но это кажется глупым, потому что почти всегда ГОТОВЫЕ_ПРОДУКТЫ изготавливаются из одних и тех же СЫРЬИХ_МАТЕРИАЛОВ_ПРОДУКТОВ.

Почти всегда или всегда? Я думаю, что это довольно важный вопрос.

Мне кажется, что когда вы меняете рецепт, вы должны создать новую строку FINISHED_PRODUCT, которая имеет другой набор RAW_MATERIAL_PRODUCTS на основе ассоциации в таблице ASSEMBLY.

Если вы хотите сгруппировать разные рецепты одного и того же FINISHED_PRODUCT вместе (что-то вроде управления версиями!), создайте таблицу FINISHED_PRODUCT_TYPE с отношением 1:m к таблице FINISHED_PRODUCT.

Изменить (цитата из комментария):

Я полностью согласен с вами, это должен быть другой продукт, но если я добавлю один винт к продукту, я не могу назвать его продуктом А с 1 дополнительным винтом. И кажется, что это может случиться. Я не совсем понял, как создать таблицу FINISHED_PRODUCT_TYPE. Не могли бы вы объяснить?

Конечно. Таким образом, ваш FINISHED_PRODUCT_TYPE определяет название продукта и, возможно, некоторые другие данные (описание, категорию и т. д.). Тогда каждая строка в FINISHED_PRODUCT по сути является «версией» этого продукта. Таким образом, «Продукт А» будет существовать только в одном месте, в строке таблицы FINISHED_PRODUCT_TYPE, но в таблице FINISHED_PRODUCT может быть одна или несколько его версий.

person Phil Sandler    schedule 10.10.2011
comment
Спасибо за ответ. Это почти все время. Я полностью согласен с вами, это должен быть другой продукт, но если я добавлю один винт к продукту, я не могу назвать его продуктом А с 1 дополнительным винтом. И кажется, что это может случиться. Я не совсем понял, как создать таблицу FINISHED_PRODUCT_TYPE. Не могли бы вы объяснить? - person Dan Dinu; 10.10.2011
comment
Обновил мой ответ. Дайте мне знать, если вам нужна дополнительная информация. - person Phil Sandler; 10.10.2011