11.04.2011, 18:55 | #1 |
Moderator
|
AX2012: После прочтения документа по изменениям в inventTrans, борюсь с непреодолимым желанием уйти в запой на недельку
После прочтения документа по изменениям в inventTrans, борюсь с непреодолимым желанием уйти в запой на недельку. Оказывается для достижения следующих простых целей:
To reduce the amount of data stored (disk space) To refactor parts of the table to avoid redundant data and the inherent risk of inconsistent data Надо было всего-то разделить таблицу inventTrans на 5 основных таблиц и порядка 25 вспомогательных (я так полaгаю - по числу подкласов, унаследованных от inventMovement). Это именно то, что было надо каждому разработчику. Сэкономить дисковое пространство (которое нонче копейки стоит) и избежать "inherent risk of inconsistent data", путем создания тучи сложно связанных таблиц. Передай большое человеческое спасибо разработчикам модуля логистики. Спроси - слышали ли они термин "over-normalization" ? |
|
|
За это сообщение автора поблагодарили: Zabr (8). |
11.04.2011, 20:06 | #2 |
Участник
|
Цитата:
Передай большое человеческое спасибо разработчикам модуля логистики
Цитата:
борюсь с непреодолимым желанием уйти в запой на недельку
Эти доки - только самые первые, я думаю далеко не все моменты были освещены, по этому не стоит спешить с выводами. Все что не делаеться - делаться только на благо (или покрайней мере с найлутшими намериниями).
__________________
Thx, Ievgenii Korovin| Dynamics Ax SCM| Microsoft Corp| http://blogs.msdn.com/DynamicsAxSCM/ |
|
11.04.2011, 20:29 | #3 |
Гость
|
Вообще-то удобство разработки конечно важно, но не является первоочередной целью.
По мне так там довольно всё просто. Наверное, вы слишком консервативны. |
|
11.04.2011, 23:09 | #4 |
Administrator
|
Цитата:
Другое дело, что в АХ исторически сложилось писать select * from таблица, т.е. выбирать все поля, а не поштучно. Это конечно удобно для разработчика, но с т.з. быстродействия все же лучше в коде указать список полей для выборки, нежели "пилить" таблицу. Посмотрим конечно - но уже сейчас на форуме то и дело проскакивают сообщения об общей тормознутости АХ 2009 после АХ 4.0 и тем более 3.0. Уже страшно предположить что будет в АХ 2012 на реальных данных. Цитата:
Особенно мне понравился тот факт (это из другого документа), что хотя в АХ 2012 и не отказались от RLS - от него планируется отказаться в будущих версиях. Оно и понятно - отчеты на SSRS тяжело строить с проверкой всех прав. Но .... это ж ключевая технология - как от нее отказываться?
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Logger (3). |
12.04.2011, 06:47 | #5 |
Участник
|
А зачем RLS, когда можно создать 100500 таблиц клиентов и товаров.
Dax 12 - почувствуй нашу любовь %) Последний раз редактировалось imir; 12.04.2011 в 06:53. |
|
12.04.2011, 10:07 | #6 |
Microsoft Dynamics
|
Цитата:
Сообщение от sukhanchik
Это с каких это пор нормализация давала улучшения в производительности? Наоборот - выборка из одной денормализованной таблицы гораздо быстрее, чем из пачки мелких.
Другое дело, что в АХ исторически сложилось писать select * from таблица, т.е. выбирать все поля, а не поштучно. Это конечно удобно для разработчика, но с т.з. быстродействия все же лучше в коде указать список полей для выборки, нежели "пилить" таблицу. Посмотрим конечно - но уже сейчас на форуме то и дело проскакивают сообщения об общей тормознутости АХ 2009 после АХ 4.0 и тем более 3.0. Уже страшно предположить что будет в АХ 2012 на реальных данных. "Благими намерениями дорога в ад вымощена" (с). Все дела в мире делаются исключительно с благими намерениями. Жизнь покажет - насколько такие архитектурные решения были оправданы. Особенно мне понравился тот факт (это из другого документа), что хотя в АХ 2012 и не отказались от RLS - от него планируется отказаться в будущих версиях. Оно и понятно - отчеты на SSRS тяжело строить с проверкой всех прав. Но .... это ж ключевая технология - как от нее отказываться? Вместо RLS предлагается Extensible Data Security Framework (XDS), который, в общем, похож на RLS по принципу работы, но требует модификации соответствующих Policy в AOT Последний раз редактировалось mifi; 12.04.2011 в 10:18. |
|
|
За это сообщение автора поблагодарили: sukhanchik (4). |
12.04.2011, 10:35 | #7 |
Administrator
|
Спасибо за информацию. А XDS - это технология, реализованная внутри АХ или СУБД?
__________________
Возможно сделать все. Вопрос времени |
|
12.04.2011, 10:42 | #8 |
Axapta
|
Так есть же дока по XDS: http://www.microsoft.com/downloads/e...ownload+Center)
|
|
|
За это сообщение автора поблагодарили: sukhanchik (2), alex55 (1). |
12.04.2011, 10:51 | #9 |
Moderator
|
Возвращаясь к вопросу нормализации данных, я для себя выработал следующий простой критерий: Назначение всех неслужебных таблиц должно быть объяснимо в терминах специалистов предметной области. Типа: CustInvoiceJour - шапки накладных, CustInvoiceTrans - строки накладных, CustTrans - субконто проводок по поставщику, CustSettlement - данные о сопоставлениях (закрытии друг на друга) платежей и оплат.
Боюсь что "эта ваша" схема разложения складских проводок не в состоянии преодолеть этот простой критерий. А ведь все это придется объяснять не только разработчикам (которые, возможно, когда-то читали про нормальные формы) но и консультантам и пользователям (которые про них, скорее всего не читали). Ну а насчет консерватизма: Каждый раз когда я вижу какое-то изменение в програмном продукте, я, совершенно точно, знаю что это приведет к дополнительным затратам для пользователя програмного продукта (по крайней мере чтобы научиться). Поэтому, в таких случаях, мне хочется понять, что же позитивного принесет пользователю (в широком смысле - от манагера проекта до бабушки-эндюзера) принесет это изменение. Боюсь что озвученных преимуществ недостаточно чтобы оправдать подобное изменение. К слову сказать, как уже было замечено sukhanchik'ом, высокая степень нормализации, несет заметное снижение производительности. А копеечный выигрыш в размере записей будет с лихвой перекрыт затратами на поддержание табличных структур данных для этих 25-30 таблиц. Ну и наконец - по поводу документации, которая ждет нас в будущем. Я же видел документацию по версиям 4/2009. Обычно там перечислены галочки, а потом высосан из пальца жизненный пример:"Джейн работает рисовальщиком красных линий в Contoso. Заказчик просит ее нарисовать три красных линии. Джейн открывает модуль рисования красных линий и выбирает пункт меню Нарисовать Красные линии. В появившемся окне, она вводит число красных линий и нажимает Enter". И ко всему этому - штук 10 скриншотов. В общем - на практике быстрее в коде посмотреть, чем продираться через напластования банальшины и пересказа меток. |
|
|
За это сообщение автора поблагодарили: Link (1), ikopyl (2), ashu (1), pm-erp (1). |
12.04.2011, 11:20 | #10 |
Microsoft Dynamics
|
Ссылку на доку уже привели - если вкратце, то поскольку все security сделали декларативным (проще говоря, вытащили в AOT), то в первом приближении XDS можно также рассматривать - привязка ограничивающего query к наборе таблиц. Все со стороны AX, как и раньше
|
|
12.04.2011, 11:49 | #11 |
Moderator
|
Хотя это, вероятно, офтопик дла данного раздела, но на самом деле, в большинстве случаев, разницы никакой нету. Все равно читается вся запись из БД и оттуда вынимаются все данные (даже если в запросе перечислена всего одна колонка). Единственные два исключения - покрывающие индексы и clustered views (которые, по моему, в 2012 не поддерживаются). Если у тебя есть, индекс по custAccount+salesId, то запрос select salesId from table where custAccount='blah' будет обрабатываться только чтением из индекса, в то время как запрос select * from table where custAccount='blah', будет приводить к чтению из индекса и из самой таблицы (ну или кластерного индекса если он есть).
|
|
12.04.2011, 12:03 | #12 |
Microsoft Dynamics
|
Цитата:
Сообщение от fed
Хотя это, вероятно, офтопик дла данного раздела, но на самом деле, в большинстве случаев, разницы никакой нету. Все равно читается вся запись из БД и оттуда вынимаются все данные (даже если в запросе перечислена всего одна колонка). Единственные два исключения - покрывающие индексы и clustered views (которые, по моему, в 2012 не поддерживаются). Если у тебя есть, индекс по custAccount+salesId, то запрос select salesId from table where custAccount='blah' будет обрабатываться только чтением из индекса, в то время как запрос select * from table where custAccount='blah', будет приводить к чтению из индекса и из самой таблицы (ну или кластерного индекса если он есть).
|
|
|
За это сообщение автора поблагодарили: Vadik (1). |
12.04.2011, 12:04 | #13 |
Banned
|
Цитата:
Сообщение от fed
После прочтения документа по изменениям в inventTrans, борюсь с непреодолимым желанием уйти в запой на недельку. Оказывается для достижения следующих простых целей:
To reduce the amount of data stored (disk space) To refactor parts of the table to avoid redundant data and the inherent risk of inconsistent data Надо было всего-то разделить таблицу inventTrans на 5 основных таблиц и порядка 25 вспомогательных (я так полaгаю - по числу подкласов, унаследованных от inventMovement). Это именно то, что было надо каждому разработчику. Сэкономить дисковое пространство (которое нонче копейки стоит) и избежать "inherent risk of inconsistent data", путем создания тучи сложно связанных таблиц. Передай большое человеческое спасибо разработчикам модуля логистики. Спроси - слышали ли они термин "over-normalization" ? Хотя настоящие тормоза в логистике в Аксапте начинаются на частых запросах к InventSum join InventDim, а не к InventTrans. |
|
12.04.2011, 12:12 | #14 |
Microsoft Dynamics
|
Цитата:
Сообщение от fed
Возвращаясь к вопросу нормализации данных, я для себя выработал следующий простой критерий: Назначение всех неслужебных таблиц должно быть объяснимо в терминах специалистов предметной области. Типа: CustInvoiceJour - шапки накладных, CustInvoiceTrans - строки накладных, CustTrans - субконто проводок по поставщику, CustSettlement - данные о сопоставлениях (закрытии друг на друга) платежей и оплат.
Боюсь что "эта ваша" схема разложения складских проводок не в состоянии преодолеть этот простой критерий. А ведь все это придется объяснять не только разработчикам (которые, возможно, когда-то читали про нормальные формы) но и консультантам и пользователям (которые про них, скорее всего не читали). Ну а насчет консерватизма: Каждый раз когда я вижу какое-то изменение в програмном продукте, я, совершенно точно, знаю что это приведет к дополнительным затратам для пользователя програмного продукта (по крайней мере чтобы научиться). Поэтому, в таких случаях, мне хочется понять, что же позитивного принесет пользователю (в широком смысле - от манагера проекта до бабушки-эндюзера) принесет это изменение. Боюсь что озвученных преимуществ недостаточно чтобы оправдать подобное изменение. К слову сказать, как уже было замечено sukhanchik'ом, высокая степень нормализации, несет заметное снижение производительности. А копеечный выигрыш в размере записей будет с лихвой перекрыт затратами на поддержание табличных структур данных для этих 25-30 таблиц. Ну и наконец - по поводу документации, которая ждет нас в будущем. Я же видел документацию по версиям 4/2009. Обычно там перечислены галочки, а потом высосан из пальца жизненный пример:"Джейн работает рисовальщиком красных линий в Contoso. Заказчик просит ее нарисовать три красных линии. Джейн открывает модуль рисования красных линий и выбирает пункт меню Нарисовать Красные линии. В появившемся окне, она вводит число красных линий и нажимает Enter". И ко всему этому - штук 10 скриншотов. В общем - на практике быстрее в коде посмотреть, чем продираться через напластования банальшины и пересказа меток. |
|
12.04.2011, 12:13 | #15 |
Moderator
|
Угу - забыл перечислить. Кстати - гораздо более жизненный пример - таблица reqLog. У меня на проекте форма reqLog открывалась порядка 30 минут при примерно 60 записях.
|
|
12.04.2011, 12:18 | #16 |
Участник
|
Цитата:
Сообщение от EVGL
Не согласен. На мой обывательский взгляд, чем меньше таблица - тем больше из нее поместится в кэш. Кроме того, в большинстве случаев в запросах к InventTrans поля InventRef и прочие не используются. В этом плане решение перебросить их в другую таблицу кажется логичным.
Хотя настоящие тормоза в логистике в Аксапте начинаются на частых запросах к InventSum join InventDim, а не к InventTrans. Про InventSum полностью согласен. На нашем проекте сделали денормализацию по складу - очень сильно ускорилось все. Использование памяти сервером БД тоже уменьшилось. |
|
12.04.2011, 12:22 | #17 |
Участник
|
Почитал про изменения в InventTrans и возникло несколько вопросиков, не обязательно к сотрудникам МС, может я сам что-то упустил:
1. Почему название поля InventTransOrigin с названием таблицы ? Логичнее кажется добавить для единообразия суффикс Id 2. Есть ли таблица InventTransOrigin и по каким полям она связывается с InventTrans и InventTransOriginSalesLine (и т.д.) или ее поля перекочевали в InventTransOriginSalesLine (и т.д.), что согласуется с примером запроса, но не структурой БД ? 3. Поле InventTrans.InventTransOrigin на сколько я понял из запроса сделано уникально для идентификации записи InventTrans? 4. Зачем поле OriginatingTable в таблицах InventTransOriginSalesLine (и т.д.) ? 5. Что хранит поле InventTransOrigin.ItemInventDim ? |
|
12.04.2011, 12:24 | #18 |
Moderator
|
Если в таблице много пустых полей или полей с повторяющимися значениями, то можно гораздо сильнее и, главное, проще сэкономить место на диске и в кэше SQL-сервера, просто включив страничную комрессию для индексов. Правда при этом нагрузка на CPU сиквела возрастет и чуток производительность операций записи снизиться. Но мне кажется, джойн 3-4 таблиц в плане роста нагрузки на сервер и падения производительности по чтению, легко перекроет вариант компрессии...
|
|
|
За это сообщение автора поблагодарили: Logger (3). |
12.04.2011, 12:30 | #19 |
Участник
|
Цитата:
Сообщение от fed
Хотя это, вероятно, офтопик дла данного раздела, но на самом деле, в большинстве случаев, разницы никакой нету. Все равно читается вся запись из БД и оттуда вынимаются все данные (даже если в запросе перечислена всего одна колонка). Единственные два исключения - покрывающие индексы и clustered views (которые, по моему, в 2012 не поддерживаются). Если у тебя есть, индекс по custAccount+salesId, то запрос select salesId from table where custAccount='blah' будет обрабатываться только чтением из индекса, в то время как запрос select * from table where custAccount='blah', будет приводить к чтению из индекса и из самой таблицы (ну или кластерного индекса если он есть).
При большом размере записи будет за один раз меньше кол-во переданных на клиент данных Простой запрос select * from InventTable на моих данные в два с половиной - три раза медленнее, чем select itemId from InventTable
__________________
Axapta v.3.0 sp5 kr2 |
|
12.04.2011, 12:54 | #20 |
Участник
|
Цитата:
1. Объединить даты в одно поле 2. Объединить статусы прихода и расхода и выстроить их в порядке возрастания 3. Ввести уникальный ключ для InventTrans (пeсть и в связке с InventTransId) 4. Данные по накладным (отгрузочные, отборочные, финансовые) выделить в отдельную таблицу и при обработке последующей накладной добавлять строно запись по предыдущей. А как же банальная формочка просмотра проводок, если в нее попадает несколько сотен записей, то скорость работы с объединенными табличками скорее всего будет близка к скорости работы с одной, но если туда будут попадать тысячи записей, то накладные расходы сервера на объединение будут ощутимыми. |
|
Теги |
ax2012 |
|
Похожие темы | ||||
Тема | Ответов | |||
Проблема с поиском в InventTrans после changeCompany (DAX4) | 11 | |||
Связь таблиц InventTrans и PurchLine | 2 | |||
Русская локализация Axapta 3 ? | 59 |
|