сценарий проектирования базы данных - PullRequest
0 голосов
/ 10 октября 2011

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

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

Хорошо.Теперь мне нужно продать готовую продукцию и рассчитать стоимость производства.Появляется сущность PRODUCT_OUT, которая может содержать только один ЗАКОНЧЕННЫЙ ПРОДУКТ, а ЗАКОНЧЕННЫЙ ПРОДУКТ может быть частью нескольких PRODUCT_OUT.

Было бы легко, если бы, например, готовый продукт A всегда был изготовлен из 3 кусочков сырого продукта a1, 2 из a2 и т. Д. Проблема в том, что количества могут измениться.

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

      TotalIn - TotalOut

, поэтому я не могу поставить количество Атрибут в СБОРКЕ, потому что я получу неверные данные при расчетеСклад.(если количество изменено)

Моя единственная идея - отказаться от сущности FINISHED_PRODUCT и создать соединение между PRODUCT_OUT и RAW_MATERIAL_PRODUCT с сущностью пересечения, содержащей количественный атрибут.Но это кажется глупым, потому что почти все время FINISHED_PRODUCT состоит из одного и того же RAW_MATERIAL_PRODUCTS.

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

1 Ответ

1 голос
/ 10 октября 2011

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

Но это кажется глупым, потому что почти всевремя, когда FINISHED_PRODUCT сделан из одного и того же RAW_MATERIAL_PRODUCTS.

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

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

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

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

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

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

...