Используя хранилище данных SQL, у меня есть такая модель:
Категория ‹-->> Товар
Коллекция ‹-->> Предмет
Бренд ‹-->> Товар
Каждая левая сущность имеет отношение ко многим под названием items с сущностью Item. Каждый из них является обратным отношениям к одному элементу категория, коллекция и бренд соответственно.
Я хочу получить все объекты бренда с хотя бы одним элементом, связанным с конкретной коллекцией И категорией. Говоря естественным языком, мне нужны все марки предметов с определенной категорией и определенной коллекцией.
Учитывая объекты Category * myCategory и Collection * myCollection, я использую для построения предиката сущности Brand в Сюда:
NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"(ANY items.category == %@) AND (ANY items.collection == %@)",myCategory,myCollection];
И я получаю правильные результаты. Проблема в производительности. Слишком медленно! И я упростил вопрос на три уровня! Давайте рассмотрим четыре уровня в многоуровневом каталоге iOS: приложение показывает доступные категории, пользователь выбирает категорию, приложение показывает коллекции в этой категории, пользователь выбирает коллекцию, приложение показывает бренды в этой коллекции (и уже выбранную категорию), пользователь выберите бренд, приложение покажет, например, материалы этого бренда, коллекции и категории ...
Честно говоря, я использую NSCompoundPredicate, чтобы вставлять субпредикаты AND при каждом выборе пользователя, динамически создавая последний предикат. Но это не имеет значения для цели вопроса.
В хранилище данных sql находится более 30 000 (30 КБ) объектов сущности Item, и использование И между элементами выполняется очень медленно (я заметил задержку в 7–10 секунд. чтобы показать бренды в приведенном выше примере).
Я бы попробовал:
- удалить связи элементы из категорий, коллекций и брендов.
-в сущности Item замените отношения category, collection и brand на выбранные свойства в таких атрибутах, как «category_id», «collection_id» и «brand_id». ".
-использовать ключевой путь или предикаты для получения брендов без использования отношений ко многим.
Прежде чем я начну уничтожать и переделывать всю работу за последние 6 месяцев, у вас есть какие-нибудь предложения? :)
Спасибо!