| Результаты опроса: Как лучше хранить ссылки на записи - (RefTableId, Company, RefRecId) | |||
| myTempTable - временная таблица |
|
4 | 21.05% |
| recordLinkList |
|
2 | 10.53% |
| map(DataAreaId, recordLinkList) |
|
0 | 0% |
| set([refTableId, refRecId, refCompanyId]) |
|
3 | 15.79% |
| map([refTableId, refCompanyId], set(refRecId)) |
|
2 | 10.53% |
| map(refTableId, map(refCompanyId, set(refRecId))) |
|
1 | 5.26% |
| другое - написал сообщение в теме |
|
5 | 26.32% |
| не знаю/мне все равно |
|
2 | 10.53% |
| Голосовавшие: 19. Вы ещё не голосовали в этом опросе | |||
|
|
Опции темы |
|
|
#1 |
|
Участник
|
Как лучше хранить ссылки на записи - (RefTableId, Company, RefRecId)
Предположим, есть какая-то программисткая утилита (это чтобы не уходить в обсуждение - можно сделать по-другому). Например, что-то типа хитро-умной проверки базы данных.
эта программисткая утилита: = сначала просматривает ВСЕ записи изо всех хранимых таблиц (не временных) и изо всех компаний (реальных или виртуальных) = во время просмотра ЗАПОМИНАЕТ где-то ссылки на записи в разных таблицах-компаниях = потом как-то обрабатывает (например, обновляет или удаляет) вопрос: а как лучше в Аксапте хранить ссылки на записи? при условии, что ссылки могут быть на разные таблицы и в разных компаниях (возможно в виртуальных) ===================== возможные варианты:
1. использовать временную таблицу стандартных таблиц не вижу. скорее всего, придется создать новую. достоинства - это почти обычная таблица с точки зрения программиста. может жить на сервере. недостатки - с временными таблицами сложно работать и отлаживать 2. recordLinkList стандартный класс. но не умеет работать с разными компаниями. или умеет? кто-нибудь какой опыт работы с этой структурой у вас? недостатки - только простой перебор записей при выборке из структуры. нет поиска и прямого позиционирования на нужную. 3. recordLinkList внутри map для каждой компании недостатки - нужно писать обертку, чтобы с этим было удобно работать 4. хранить множество из контейнеров. недостатки - 5. хранить несколько множеств в map. ключ в map - контейнер, ключ в set - refRecId недостатки: = нужно писать обертку, чтобы с этим было удобно работать = у контейнера те же самые недостатки, что и в пункте 4 6. чтобы избавиться от контейнеров и от преобразований типов недостатки нужно писать обертку, чтобы с этим было удобно работать Последний раз редактировалось mazzy; 05.07.2011 в 16:24. Причина: убрал про преобразование типов. спасибо AndyD |
|
|
|
|
#2 |
|
Moderator
|
8. Забыл про квазивременную таблицу. То есть - обычную таблицу в БД с полями RefTableId,refRecId,refCompanyId, в которую добавлен, например id сессии или просто GUID-какой-то. По завершении процедуры просто тупо оттуда удаляем записи по условию.
Лично я бы, (не знаю как обосновать, просто по личному опыту) использовал бы вариант 5, если предполагается что будет обработано не больше 10 тысяч записей и вариант 8 во всех остальных случаях. |
|
|
|
|
#3 |
|
Участник
|
Цитата:
но на нее будет тратится recid. надо будет не забывать ее чистить... в общем, куча гемора. но согласен с тем, что просто временная таблица может тормозить при большом числе записей (больше нескольких десятков тысяч) |
|
|
|
|
#4 |
|
Участник
|
Цитата:
А с чего такое заключение? Элементы контейнера хранятся точно так же, как переменные этого же типа А по сути вопроса согласен с fed PS Для 2012-й - использовать временные таблицы на SQL-сервере
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 05.07.2011 в 13:42. |
|
|
|
|
#5 |
|
Участник
|
|
|
|
|
|
#6 |
|
MCTS
|
Ответ на вопрос
уж очень сильно зависит от К предложенным вариантам можно добавить сохранение во внешний файл (например, csv).
__________________
Dynamics AX Experience |
|
|
|
|
#7 |
|
Участник
|
И где в приведенной ссылке говорится о преобразовании значений к строковому типу?
Простой путь проверки - посмотреть в Management Studio значение блоб-поля SysLastValue.Value
__________________
Axapta v.3.0 sp5 kr2 |
|
|
|
| За это сообщение автора поблагодарили: mazzy (5). | |
|
|
#8 |
|
Участник
|
Стандартная реализация квазивременной таблицы для хранения ссылок: RecordReferenceList_RU Выборка произвольных записей одним запросом
В той же теме mazzy сам давал ссылку и на другое схожее бсуждение axaptapedia: Tutorial Form MultiSelectCheckBox.
|
|
|
|
|
#9 |
|
Участник
|
Цитата:
Сообщение от S.Kuskov
Стандартная реализация квазивременной таблицы для хранения ссылок: RecordReferenceList_RU Выборка произвольных записей одним запросом
В той же теме mazzy сам давал ссылку и на другое схожее бсуждение axaptapedia: Tutorial Form MultiSelectCheckBox. ![]() в теме MultiSelectCheckBox также обсуждаются ссылки на одну таблицу. |
|
|
|
|
#10 |
|
Ищущий знания...
|
создал бы отдельную базу на SQL, с таблицей со всеми необходимыми полями. и использовал бы её для своих нужд
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
|
|
#11 |
|
Administrator
|
Я за вариант 8.
Цитата:
Цитата:
![]() А с очисткой как раз все просто. Нужно просто только на какой-то момент иметь завершенную работу этой утилитки (как вариант - остановка АОС). И тогда Truncate Table отрабатывает быстро и на ура. Можно туда добавить поле, аналог кода сессии - типа утилитка отработала один раз - все записи отметились одним кодом. Утилитка отработала второй раз - новые записи отметились другим кодом и т.д. По этому коду сделать индекс и чистить по индексу. Это если хочется чистить сразу. А можно этим и не заморачиваться - а дождаться возможности выполнить Truncate Table Конечно остановка АОС - решение радикальное ... Но тут все зависит от того будут ли перерывы у утилитки, насколько сильно она будет увеличивать кол-во записей в этой таблице. Пример 1. InventSumLogTTS. Ее можно честно чистить после остановке АОСа. Пример 2. Batch. Там хранится туева хуча мусора, и в нее постоянно складываются записи. Раз в некий период (когда ну очень хочется уменьшить место, занимаемое базой) нужные записи переливаются в копию Batch, исходная таблица грохается, а копия выдается за оригинал.
__________________
Возможно сделать все. Вопрос времени |
|
|
|
|
#12 |
|
Участник
|
|
|
|
|
|
#13 |
|
Участник
|
ничего не мешает.
просто этот случай сводится к пункту 3. =============== вообще говоря, я бы послушал ваши соображения какой вариант лучше какой хуже и почему ![]() =============== насчет варианта 8 - хранить в постоянной таблице с идентификатором сессии мне кажется, что это дико неочевидный вариант, который сильно усложнит дальнейшую поддержку и работу других программистов. |
|
|
|
|
#14 |
|
Участник
|
Я бы сказал, что это гибрид пунктов 3 и 8, т.к. для хранения данных RecordReferenceList_RU использует не оперативную память, а таблицу БД, что позволяет использовать для работы с ним join. Лично для меня это преимущество. А что будет преимуществом для вас я не знаю
. От того как вы собираетесь обходить или обрабатывать записи и будет зависеть выбор варианта хранения/доступа к записям.Цитата:
|
|
|
|
| За это сообщение автора поблагодарили: sukhanchik (2). | |
|
|
#15 |
|
Administrator
|
Цитата:
. Скажу лишь только то, что как раз с т.з. отладки всякие map-ы, set-ы и временные таблицы - причиняют гораздо большее неудобство, нежели постоянные таблицы.
__________________
Возможно сделать все. Вопрос времени |
|
|
|
| За это сообщение автора поблагодарили: egorych (1). | |
|
|
#16 |
|
Участник
|
Цитата:
Сообщение от mazzy;253447
1. использовать временную таблицу [B стандартных таблиц не вижу[/B]. скорее всего, придется создать новую.
достоинства - это почти обычная таблица с точки зрения программиста. может жить на сервере. недостатки - с временными таблицами сложно работать и отлаживать StrRef использовать под компанию.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
|
|
|
#17 |
|
Участник
|
Цитата:
Тут вопрос в том, что мы (программисты имею ввиду) все равно (в конечном итоге) оперируем понятием ТАБЛИЦА - т.е. используем реляционную структуру. Все эти мапы, классы и т.д. ИМХО притянуты за уши (в Аксапте имею ввиду).
__________________
Axapta 3.0 sp - хз какой, kr2 Последний раз редактировалось egorych; 06.07.2011 в 09:30. |
|
|
|
| За это сообщение автора поблагодарили: S.Kuskov (1). | |
|
|
#18 |
|
Участник
|
со случаем, когда отмечается очень большое (больше нескольких десятков тысяч) записей, понятно - таблица.
предлагаю обсудить как лучше отмечать записи в разных таблицах, если предполагается, что отмеченных записей будет меньше нескольких десятков тысяч (в разных таблицах, в разных компаниях). Как правильнее хранить ссылки в этом случае? Почему? См. также разбор случая для меток записей одной таблицы axaptapedia: Tutorial Form MultiSelectCheckBox =========================== Отдельно хотелось бы спросить - может у кого-нибудь есть опыт работы с recordLinkList? Вроде системный класс. И существует давно. Но практически не используется. Почему? |
|
|
|
|
#19 |
|
Участник
|
Цитата:
Если бы ссылок было очень много, понятно, что можно было бы сделать таблицу и не заморачиваться этими вопросами - просто прикрутить нужные индексы. Но если ссылок будет немного, тогда выбор, скорее всего, падет на ядрёные классы-коллекции, а тут уже очень важно определиться с тем, что будет использоваться в качестве ключа. Выбор же ключа, очевидно, напрямую зависит от того, как будут использоваться данные. К слову, мне лично в последнее время нравится хранить во всяких там Map'ах записи временных таблиц: и на диск ничего не выпадает, в отличие от самих временных таблиц, и данные типизированы и понятны; контейнеры в этом плане я лично просто "не перевариваю".Кто сказал? AxLINQ version 1.0 AX Developer tips: LINQ in X++ Dynamics Ax + LINQ |
|
|
|
| За это сообщение автора поблагодарили: S.Kuskov (3). | |
|
|
#20 |
|
Участник
|
Цитата:
в такой постановке можно говорить о границах применимости. в каких случаях что лучше использовать. |
|
|
| Теги |
| recid, запись, как правильно, ссылки |
|
|
|