|  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 | 
| Участник | Цитата: 
		
			Передай большое человеческое спасибо разработчикам модуля логистики
		
	  Обязательно передам. Цитата: 
		
			борюсь с непреодолимым желанием уйти в запой на недельку
		
	  . В этом случаи инвент транс* normalized по сравнению с ax2009, что дает улутшения по производительности в целом + много плюсов для архитекруты системы (не говоря уже какое количество багов было пофикшено по ходу). Эти доки - только самые первые, я думаю далеко не все моменты были освещены, по этому не стоит спешить с выводами. Все что не делаеться - делаться только на благо (или покрайней мере с найлутшими намериниями). 
				__________________ 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 | |||
| 
 |