2016-11-07 2 views
4

КОНТЕКСТRealm и указатели на свойства

Realm не поддерживает индексы на отношения свойств (объектов). https://realm.io/docs/objc/latest/#indexed-properties Если вы попробуете, это вызовет ошибку.

У нас есть ситуация, когда нам нужно запросить отношения модели и другое свойство.

Обычно вы могли бы сделать это, имея индекс покрытия через (foreign_id, собственность), но это не представляется возможным в Realm (пока?)

Например

@interface Book : RLMObject 
@property NSNumber<RLMInt> * page; 
@end 

@interface Page : RLMObject 
@property Book * book; 
@property NSNumber<RLMInt> * line; 
@end 

[Page objectsInRealm:realm where:@"book.uuid = %@ AND page.line = %@", uuid, @1]; 

ВОПРОС

Каков наилучший способ настройки индексов, чтобы запрос был оптимальным? Связаны ли уже индексированные отношения? Или я создаю другое свойство на странице, называемое book_uuid, и индекс на нем?

Приветствие

+0

Ну, этот код должен работать нормально, если вы не пытаетесь вызвать 'distinct()' on' book.uuid'. – EpicPandaForce

+0

Но он проиндексирован? У меня есть сотни книг с тысячами страниц каждый. –

+0

В этом случае я рекомендую добавить новое поле в страницу и индекс, который – EpicPandaForce

ответ

1

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

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

@interface Page : RLMObject 
@property NSInteger line; 
@end 

RLM_ARRAY_TYPE(Page) 

@interface Book : RLMObject 
@property RLMArray<Page *><Page> *pages; 
@end 

Book *book = [[Book allObjects] firstObject]; 
Page *page = [[book.pages objectsWhere:@"line = %@", @1] firstObject]; 

пока вы разметили line как индексированные собственности, это должно работать очень быстро, в теории. Но, поскольку вы упомянули, что у вас есть тысячи строк страниц, мне было бы интересно узнать, что такое реальная работа.

+0

К сожалению, при таком подходе мы не можем напрямую использовать RLMChangeCollection после изменения книги (потому что нам нужно сделать второй запрос в книге), а также коротко заблокируйте поток запросов. Однако с некоторым рефакторингом и обертыванием его в нашем собственном «RLMChangeCollection», я думаю, мы могли бы заставить его работать. –

+0

Нынешняя реальная производительность, которую мы видим, - это задержки загрузки страниц в течение 2-3 секунд на iPad Air, но это без каких-либо индексов. (У нас есть около 30000 страниц в базе данных в целом) –

+0

Если вы имеете дело с наблюдением за одной «Книгой», вы можете использовать KVO для наблюдения за обновлением ее свойств. ОК, круто! Мы надеемся, что это будет намного быстрее, если страницы будут проиндексированы. – TiM

Смежные вопросы