Я использую объектную базу данных (ZODB) для хранения сложных взаимосвязей между многими объектами, но сталкиваюсь с проблемами производительности.В результате я начал создавать индексы, чтобы ускорить поиск и вставку объектов.Вот моя история, и я надеюсь, что вы можете помочь.
Изначально, когда я добавлял объект в базу данных, я вставлял его в ветку, посвященную этому типу объекта.Чтобы предотвратить несколько объектов, представляющих одну и ту же сущность, я добавил метод, который будет перебирать существующие объекты в ветви, чтобы найти дубликаты.Сначала это работало, но по мере увеличения размера базы данных время, необходимое для загрузки каждого объекта в память и проверки атрибутов, росло экспоненциально и неприемлемо.
Чтобы решить эту проблему, я начал создавать индексы на основе атрибутов вобъект, чтобы при добавлении объекта он сохранялся как в ветви типа, так и в ветви индекса значения атрибута.Например, допустим, что я сохранял объект person с атрибутами firstName = 'John' и lastName = 'Smith', объект добавлялся к ветви типа объекта person и также добавлялся к спискам в пределах ветви индекса атрибута с ключами 'Джон 'и' Смит '.
Это сэкономило много времени при проверке дубликатов, поскольку новый объект можно было проанализировать, и нужно проверять только набор объектов, которые пересекаются в индексах атрибутов.
Однако я быстро столкнулся с другой проблемой, касающейся действий при обновлении объектов.Индексы необходимо будет обновить, чтобы отразить тот факт, что они могут быть неточными.Это требует либо запоминания старых значений, чтобы к ним можно было напрямую получить доступ к объекту, и удаления объекта, либо итерации по всем значениям типа атрибута, чтобы найти, а затем удалить объект.В любом случае производительность снова начинает быстро снижаться, и я не могу найти способ ее решить.
У вас уже были подобные проблемы?Что вы решили, или это просто то, с чем мне приходится сталкиваться при использовании OODBMS?
Заранее благодарен за помощь.