Вопрос

Я использую Access 2003 VBA для обработки рекурсивных данных для производственных спецификаций.Я создал модуль класса, чтобы позволить моим основным таблицам иметь статическую область видимости.Кажется, это упрощает рекурсию - это освобождает меня от повторного подсчета уровней вниз и вверх по мере прохождения спецификации.Я не открываю один и тот же набор записей избыточно;Вместо этого я много фильтрую.

Начав эту работу, я прочитал о моделировании объектных отношений и решил создать экземпляр не набора записей, а записи.Тогда поля этой записи могли бы быть свойствами.После большой работы и многих ощущений победы, которые в основном были ошибочными, я понял, что этот подход не имеет никаких преимуществ, поскольку Access основан на таблицах.

Модули моего класса по-прежнему помогают, как и раньше.Мой вопрос касается двух альтернативных версий, приведенных ниже.Первый использует два экземпляра (Родительский,Дочерний).Второй использует один из них, а затем использует его повторно.Очевидно, что первый из них находится под влиянием ORM.

Есть ли какая-то причина предпочесть одно из них другому?Кроме того, обратите внимание на выделенную курсивом строку в конце:Если мне это не нужно (потому что мне не нужна дополнительная информация о Родителе), меняет ли это ответ?Кто-нибудь может помочь мне с моим мышлением в целом?

(Обратите внимание, что я закрываю наборы записей, но не экземпляры класса.Насколько я понимаю, экземпляры VBA закрываются сами, и позволять им делать это - общепринятая практика.Кажется , я вывел псевдокод на новый уровень псевдокодирования ...цель - ясность, надеюсь, это сработает.)

    VERSION 1 
    Property Sub ReviewPart ( Parent_Part_ID )

    Get Parent_Part_ID
    Create instance of Class --> Get recordset
    Filter Class recordset ( Parent_Part_ID )
    Exploit Class recordset
    See if Parent_Part_ID has Childs
    If it does:
       Open recordset of Childs
       For each Child
         Get Child_Part_ID
         Создать экземпляр класса -> Получить набор записей
         Filter Class recordset ( Child_Part_ID )
         Exploit Class recordset
         See if Child_Part_ID has Childs
         If it does:  
           Instance New ReviewPart ( Child_Part_ID )
         Otherwise:
         Nothing; Move On
       Next Child
       Close recordset of Childs
    Otherwise:
       Move On
    Набор записей класса эксплойта ( по - прежнему указывает на родительский )
 
VERSION 2 Property Sub ReviewPart ( Parent_Part_ID ) Get Parent_Part_ID Create instance of Class --> Get recordset Filter Class recordset ( Parent_Part_ID ) Exploit Class recordset See if Parent_Part_ID has Childs If it does: Open recordset of Childs For each Child Get Child_Part_ID Создать экземпляр класса -> Получить набор записей Filter Class recordset ( Child_Part_ID ) Exploit Class recordset See if Child_Part_ID has Childs If it does: Instance New ReviewPart ( Child_Part_ID ) Otherwise: Nothing; Move On Next Child Close recordset of Childs Otherwise: Move On Набор записей класса фильтра ( Parent_Part_ID ) Набор записей класса эксплойта ( по - прежнему указывает на родительский )
Это было полезно?

Решение

Похоже, что первое обеспечивает вам большую простоту использования с точки зрения программиста, поскольку можно просто начать с интересующей вас записи и легко внедриться в ассоциированные записи, просто обратившись к свойствам записи, с которой вы начали.

С другой стороны, последнее представляется более эффективным, поскольку оно не пессимистично загружает каждую запись, которая может быть связана с текущей.

Пара потенциальных оптимизаций первого подхода, которые могли бы помочь ему приблизиться к эффективности второго при сохранении простоты использования:

  • Загружайте дочерние записи только по мере необходимости.Использование методов доступа Get / Set позволит вам загружать их точно в срок, а не все сразу, когда родительская запись извлекается из базы данных.
  • В качестве альтернативы используйте соединение для извлечения всех дочерних данных сразу как часть одного запроса.Это по-прежнему дало бы вам все предварительно загруженные данные, но существенно сократило бы количество запросов, которые вам нужно выполнить, чтобы их получить.

Надеюсь, это хоть как-то поможет.

Другие советы

Рассматривали ли вы возможность использования поставщика msdatashape и синтаксиса SHAPE для создания иерархические наборы записей ADO?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top