|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
Делал когда-то простенькую модель склада Приход сырья (бумага): Код: plsql 1. 2. 3. 4. 5. 6. 7.
при добавлении рулона бумаги, остаток становится равным весу рулона склад сбрасывает рулоны на расход добавляя рулон в "промежуточную" табличку Код: plsql 1. 2. 3. 4. 5. 6.
когда рулон используем в производстве, добавляем его в соотв. табличку (из WP_ROLLS_OUT) Код: plsql 1. 2. 3. 4. 5. 6. 7.
при добавлении рулона в смену, его остаток в таблице WP_SUPPLY_ROLLS через триггеры автоматом уменьшается на величину USED_WEIGHT *write_off - если 1 рулон списан целиком (выставляется вручную) сейчас всё чудно работает: что висит на расходе склада - выборка из WP_ROLLS_OUT за исключение тех рулонов, что есть в WP_ROLLS_SHIFT (NOT IN) приход сырья - Суммируем вес WP_SUPPLY_ROLLS и группируем по бумаге остаток - выборка из WP_SUPPLY_ROLLS за исключение тех рулонов, что есть в WP_ROLLS_SHIFT (NOT IN) расход - ищем первое вхождение рулона в WP_ROLLS_SHIFT (первая смена в котором использовался рулон) есть ещё понятие остатков бумаги на производстве (так же как и рулоны на расходе, но с доп. условиями): Код: plsql 1. 2.
чую, что получился велосипед)) подскажите, как упростить модель с точки зрения исключения или оптимизации постоянно используемых мною запросов NOT IN (WP_ROLLS_SHIFT) быть может какие-то best practices складского учёта :) p.s. к этой теме вернулся из-за того, что нужно выводить остатков бумаги на производстве на каждый день, что выльется в огромную кучу условий ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2017, 15:34 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
Если смотреть на Вашу схему - не очень понятно, зачем Вам условие NOT IN WP_ROLLS_SHIFT. Почему бы сразу не выкидывать рулон из WP_ROLLS_OUT, если он начал расходоваться? Когда Вам нужна выборка из WP_ROLLS_OUT включая те, которые есть в WP_ROLLS_SHIFT? best practices безусловно есть, и они мало похожи на Ваши :) Я бы советовал для начала постараться свести бизнес-процессы к двум операциям "приход" и "списание", не пытаясь создавать какие-то дополнительные сущности. Скажем, бизнес-процесс "сбрасывает рулоны на расход" я бы попробовал описать как "списание с основного склада" + "приход на виртуальный склад-производство". "используется в производстве" = "списание с виртуального склада-производства". Если это получится - можно задуматься о том, как хранить остатки так, чтобы эти операции эффективно создавались и учитывались Если некий бизнес-процесс совсем, ну совсем никак не ложится на эти 2 операции- ну тогда надо уже задумываться "а не завести ли новую сущность". ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2017, 17:02 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
Кот Матроскин, авторзачем Вам условие NOT IN WP_ROLLS_SHIFT. пока рулон не использовался - он на складе авторПочему бы сразу не выкидывать рулон из WP_ROLLS_OUT изначально думал чистить по прошествии некоторого времени или удалять сразу, но не определился и оставил) авторКогда Вам нужна выборка из WP_ROLLS_OUT включая те, которые есть в WP_ROLLS_SHIFT? не нужно, но если реализовывать остатки на производстве в текущей модели, эти данные как раз и понадобятся авторЯ бы советовал для начала постараться свести бизнес-процессы к двум операциям "приход" и "списание", не пытаясь создавать какие-то дополнительные сущности. Скажем, бизнес-процесс "сбрасывает рулоны на расход" я бы попробовал описать как "списание с основного склада" + "приход на виртуальный склад-производство". "используется в производстве" = "списание с виртуального склада-производства". приход понятен - внесли данные накладной и делов. "списание с основного склада" -> "приход на виртуальный склад-производство" как раз и реализуется через WP_ROLLS_OUT, т.к. склад и производство - это разные подразделения (это раз), принимая рулон, оператору на производстве проще выбрать рулон из маленького списка (который подготовил склад), чем из огромного общего (это два) "используется в производстве" = "списание с виртуального склада-производства" - если рулон использован до конца - его списываем сразу, а вот если на нём остался остаток - вот тогда он болтается... при том, что его остаток висит на самом рулоне (для того, чтобы вывести остатки на определённую дату - получается ни то ни сё) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2017, 17:34 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
mkrпока рулон не использовался - он на складе Физически? Не верю. Что это за производство/станок, который способен жрать бумагу прямо из рулона, лежащего на складе? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2017, 17:49 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
mkr, например, best practices на основе Microsoft Dynamics (упрощенно): Есть таблица складских транзакций inventtrans c полями Дата транзакции (дата прихода расхода) Номенклатура (бумага) Аналитика (склад, номер рулона) Тип транзакции (Приход / Расход) Количество (для приходов +, для расходов -) + дополнительная таблица текущих остатков Приход - транзакция Приход на склад хранения Перемещение в производство делается двумя транзакциями - списываем со склада хранения и приходуем на склад производства Расход - транзакция Расход со склада производства ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2017, 17:49 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, конечно же логически) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2017, 17:54 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
mkrконечно же логически) А потом идёт инвентаризация и спрашивают кладовщика "а где у вас вот этот вот рулон?", а ему и сказать нечего. Не выпендривайся, делай как Кот говорит. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2017, 18:16 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
интересное решение от bideveloper по предложению Кот Матроскин , как Я понял, расширить использование WP_ROLLS_OUT (что в этой таблице, значит в производстве, останется только остатки посчитать) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2017, 10:23 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
mkrинтересное решение от bideveloper Вообще-то это классика любого складского учета. В том же Навижн вообще нет физического понятия/поля "остаток". Есть "сумма движений на дату". Считает на лету. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2017, 10:41 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
bideveloperнапример, best practices на основе Microsoft Dynamics (упрощенно): Есть таблица складских транзакций inventtrans c полями Дата транзакции (дата прихода расхода) Номенклатура (бумага) Аналитика (склад, номер рулона) Тип транзакции (Приход / Расход) Количество (для приходов +, для расходов -) + дополнительная таблица текущих остатков внедрил, крутится! появилась ещё парочка вопросов - так ли необходим Тип транзакции (можно же определять из прихода: >0 приход, <0 расход)? как удобнее считать остатки? текущие остатки можно делать через триггеры остатки на дату - полный расчёт или через те же триггеры делать хотя бы месячные снапшоты + движение по месяцу до нужной даты? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2017, 11:19 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
mkrвнедрил, крутится! появилась ещё парочка вопросов - так ли необходим Тип транзакции (можно же определять из прихода: >0 приход, <0 расход)? как удобнее считать остатки? текущие остатки можно делать через триггеры остатки на дату - полный расчёт или через те же триггеры делать хотя бы месячные снапшоты + движение по месяцу до нужной даты? Тип транзакции нужен, потому что приходы и расходы - понятие растяжимое. Одно дело в производство использовать, другое дело по негодности списать или поставщику вернуть. Для склада это все один черт - выбытие со склада, а людям - совершено разные документы нужны. Хранить ли остатки на концы месяцев? С одной стороны, можно и без них, если база небольшая и расчет на лету проходит достаточно быстро. С другой стороны, хранить их все же удобно. Ведь остатки на произвольную дату нужны редко. Чаще либо текущие, либо помесячные, например для аналитики за год. Тут-то они и пригодятся. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2017, 11:52 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
автортак ли необходим Тип транзакцииЖизненно необходим. Расход это : продажа, списание, инвентаризация, возврат поставщику, вн.перемещение и пр. Приход это : покупка, инвентаризация, возврат от покупателя, вн.перемещение и пр. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2017, 12:02 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
Cane Cat FisherХранить ли остатки на концы месяцев? С одной стороны, можно и без них, если база небольшая и расчет на лету проходит достаточно быстро. С другой стороны, хранить их все же удобно. Ведь остатки на произвольную дату нужны редко. Чаще либо текущие, либо помесячные, например для аналитики за год. Тут-то они и пригодятся. За такие советы надо брать введение Дейта и по голове несколько раз, пока смысл слова "нормализация" не пробьется сквозь кость. 😀 Хранить остатки НЕ НУЖНО. Для этого есть индексы. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2017, 11:25 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
s_ustinovХранить остатки НЕ НУЖНО. Для этого есть индексы.Ога. Смотря сколько остатков. Если это база сети маркетов (штук хотя бы на сто), то никакие индексы не помогут. Что-то таки придется хранить... :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2017, 11:29 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
LSVs_ustinovХранить остатки НЕ НУЖНО. Для этого есть индексы.Ога. Смотря сколько остатков. Если это база сети маркетов (штук хотя бы на сто), то никакие индексы не помогут. Что-то таки придется хранить... :) Давайте на конкретных примерах. Предположим, есть таблица товародвижений: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Делаем представление с остатками: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Смотрим остатки: Код: sql 1. 2. 3. 4.
Сперва смотрим без индекса, а потом создаем индекс Код: sql 1. 2. 3. 4. 5.
и делаем тот же запрос с индексом. Результат на картинке. Стоимость запроса без индекса - 135, стоимость запроса с индексом - 0,016. В восемь с половиной тысяч раз лучше - на маленьких данных (2,2 миллиона строк), если данных больше - разница будет еще существеннее. А теперь, внимание, вопрос - какой альтернативный подход даст лучший результат? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2017, 13:14 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
s_ustinovА теперь, внимание, вопрос - какой альтернативный подход даст лучший результат? Подход, при котором оный пересчет остатков происходит не в онлайне, грузя OLTP, а в специально выбранное время. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2017, 13:24 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
Кот Матроскинs_ustinovА теперь, внимание, вопрос - какой альтернативный подход даст лучший результат? Подход, при котором оный пересчет остатков происходит не в онлайне, грузя OLTP, а в специально выбранное время. Если мы говорим о "модель данных склада", то остатки должны быть актуальны в любой момент времени - они используются в бизнес логике. Если же мы говорим о системе отчетности, то это правильнее делать в ОТДЕЛЬНОЙ базе. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2017, 13:30 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
s_ustinovКот Матроскинпропущено... Подход, при котором оный пересчет остатков происходит не в онлайне, грузя OLTP, а в специально выбранное время. Если мы говорим о "модель данных склада", то остатки должны быть актуальны в любой момент времени - они используются в бизнес логике. Остатки должны быть актуальны, но они не обязаны лежать в окончательном виде в базе - вполне могут получаться запросом "остаток на опорную дату + оборот с тех пор". А остатки на опорные даты - могут рассчитываться тогда, когда это удобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2017, 14:16 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
Кот Матроскинs_ustinovпропущено... Если мы говорим о "модель данных склада", то остатки должны быть актуальны в любой момент времени - они используются в бизнес логике. Остатки должны быть актуальны, но они не обязаны лежать в окончательном виде в базе - вполне могут получаться запросом "остаток на опорную дату + оборот с тех пор". А остатки на опорные даты - могут рассчитываться тогда, когда это удобно. Во первых, нарушается нормализация. Если по каким либо причинам остатки на опорную дату рассчитаются с ошибками, то и текущие остатки будут считаться с ошибками, хотя в таблице товародвижений ошибок нет. Во вторых, усложняется код. Написать запрос к одной вьюшке существенно проще, чем запрос "остаток на опорную дату + оборот с тех пор" - повышаются риски ошибок в коде. И, в третьих (самое главное), в большинстве случаев вариант с хранением остатков на опорную дату будет в целом работать медленнее, чем индексированное представление . При записи в таблицу в любом случае считается и пишется несколько индексов, и добавление еще одного индекса сильно ситуацию не изменит. Обычно количество операций чтения в несколько раз превышает количество операций записи, а так как чтение из одного индекса существенно быстрее, чем чтение из двух таблиц + группировка + джоин, то общий эффект от хранения остатков будет отрицательным (по сравнению с индексированным представлением). ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2017, 15:40 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
mkrостатки на дату - полный расчёт или через те же триггеры делать хотя бы месячные снапшоты + движение по месяцу до нужной даты? остатки на дату 2 варианта: 1. Которые используются в бизнес-логике, в Аксапте считается, что они недалеко от текущей даты. Поэтому в классах расчета используется схема: остатки на текущую дату - движение от прошлой даты до текущей, для получения остатков на прошлую дату. 2. для аналитической отчетности используется OLAP, который легко считает остатки на любую дату по таблице транзакций. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2017, 16:09 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
s_ustinovИ, в третьих (самое главное), в большинстве случаев вариант с хранением остатков на опорную дату будет в целом работать медленнее, чем индексированное представление . При записи в таблицу в любом случае считается и пишется несколько индексов, и добавление еще одного индекса сильно ситуацию не изменит. Обычно количество операций чтения в несколько раз превышает количество операций записи, а так как чтение из одного индекса существенно быстрее, чем чтение из двух таблиц + группировка + джоин, то общий эффект от хранения остатков будет отрицательным (по сравнению с индексированным представлением). WTF "в целом"? Вы складываете мухи с котлетами - мало того что производительность разных операций, но даже разных типов операций (чтение и запись). К разным системам бывают разные требования - бывает "количество операций чтения [остатков] в несколько раз превышает количество операций записи", а бывает, что узкое место - именно и конкретно запись, а остатки можно спокойно посчитать когда-нибудь потом в нерабочее время. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2017, 16:14 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
Кот Матроскинs_ustinovИ, в третьих (самое главное), в большинстве случаев вариант с хранением остатков на опорную дату будет в целом работать медленнее, чем индексированное представление . При записи в таблицу в любом случае считается и пишется несколько индексов, и добавление еще одного индекса сильно ситуацию не изменит. Обычно количество операций чтения в несколько раз превышает количество операций записи, а так как чтение из одного индекса существенно быстрее, чем чтение из двух таблиц + группировка + джоин, то общий эффект от хранения остатков будет отрицательным (по сравнению с индексированным представлением). WTF "в целом"? Вы складываете мухи с котлетами - мало того что производительность разных операций, но даже разных типов операций (чтение и запись). К разным системам бывают разные требования - бывает "количество операций чтения [остатков] в несколько раз превышает количество операций записи", а бывает, что узкое место - именно и конкретно запись, а остатки можно спокойно посчитать когда-нибудь потом в нерабочее время. В тех системах, с которыми я работал, при записи операций товародвижений происходит также чтение остатков - чтобы не отгрузить больше, чем есть в наличии. То есть при записи выполняется и чтение. И сравнивать варианты нужно в комплексе: Вариант 1 - запись в таблицу, по которой есть индексированное представление + чтение из индекса Вариант 2 - запись в таблицу без индексированного представления + чтение из таблицы товародвижений, таблицы остатков, группировка и джоин Я очень сомневаюсь, что второй вариант вообще может быть существенно быстрее первого. И еще менее вероятной выглядит ситуация, что вариант 2 может быть настолько быстрее варианта 1, чтобы имело смысл городить дополнительные процедуры пересчета остатков, писать более сложный код получения остатков и следить, чтобы вся эта конструкция не поломалась. Заметьте, время расчета остатков в таблице остатков (в нерабочее время) в этом сравнении вообще не учитываем. Также не учитываем соотношение количества транзакций чтения остатков к количеству транзакций записи товародвижений. Разумеется, можно придумать условный пример, при котором хранение остатков на дату в отдельной таблице имеет смысл. Но давайте обсуждать примеры из реальной жизни OLTP систем. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2017, 17:09 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
s_ustinovВо первых, нарушается нормализация Укажите, какие нормальные формы нарушаются при хранении остатков? s_ustinovЕсли по каким либо причинам остатки на опорную дату рассчитаются с ошибками А если запрос вычисления остатков на лету отработает с ошибкой? "По каким-либо причинам". s_ustinovВо вторых, усложняется код. Написать запрос к одной вьюшке существенно проще, чем запрос "остаток на опорную дату + оборот с тех пор" - повышаются риски ошибок в коде. А почему вы сравниваете с вариантом "остаток на опорную дату + оборот с тех пор"? Если нужны текущие остатки, так и храните текущие. И получать их будет гораздо проще и быстрее, чем "Написать запрос к одной вьюшке". ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2017, 10:21 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
Cane Cat Fishers_ustinovВо первых, нарушается нормализация Укажите, какие нормальные формы нарушаются при хранении остатков? Не помню Дублирование данных - это ВСЕГДА нарушение нормализации, так как неключевой столбец (количество) зависит от записей в других таблицах. Cane Cat Fishers_ustinovЕсли по каким либо причинам остатки на опорную дату рассчитаются с ошибками А если запрос вычисления остатков на лету отработает с ошибкой? "По каким-либо причинам". Значит у нас ОЧЕНЬ серьезные проблемы с СУБД. Не с базой, а именно СУБД. Так как индексы считает именно СУБД. Cane Cat Fishers_ustinovВо вторых, усложняется код. Написать запрос к одной вьюшке существенно проще, чем запрос "остаток на опорную дату + оборот с тех пор" - повышаются риски ошибок в коде. А почему вы сравниваете с вариантом "остаток на опорную дату + оборот с тех пор"? Если нужны текущие остатки, так и храните текущие. И получать их будет гораздо проще и быстрее, чем "Написать запрос к одной вьюшке". А можно продемонстрировать на конкретном селекте "получать их будет гораздо проще и быстрее, чем "Написать запрос к одной вьюшке""? Чтобы ваш селект был проще того, который я приводил в качестве примера. Код: sql 1. 2. 3. 4.
А именно такой подход рассматриваю вот по этому: Кот Матроскинs_ustinovпропущено... Если мы говорим о "модель данных склада", то остатки должны быть актуальны в любой момент времени - они используются в бизнес логике. Остатки должны быть актуальны, но они не обязаны лежать в окончательном виде в базе - вполне могут получаться запросом "остаток на опорную дату + оборот с тех пор". А остатки на опорные даты - могут рассчитываться тогда, когда это удобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2017, 12:07 |
|
Помогите довести до ума модель данных склада
|
|||
---|---|---|---|
#18+
s_ustinovCane Cat Fisherпропущено... Укажите, какие нормальные формы нарушаются при хранении остатков? Не помню Дублирование данных - это ВСЕГДА нарушение нормализации, так как неключевой столбец (количество) зависит от записей в других таблицах. Ну так посмотрите у Дейта. Вы не забыли, что все еще его в руках держите, с целью меня огреть? И почитайте что-нибудь более практическое, чем это святое писание полувековой давности. Тогда поймете, что нормализация - не самоцель, а средство для избежания аномалий обновления. И денормализация - не преступление, а средство повышения производительности в узких местах. И дискуссия станет более предметной. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2017, 18:25 |
|
|
start [/forum/topic.php?fid=32&fpage=3&tid=1539858]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
3ms |
others: | 12ms |
total: | 160ms |
0 / 0 |