领域和属性的索引

时间:2016-11-07 13:57:44

标签: realm

CONTEXT

Realm不支持关系属性(对象)的索引。 https://realm.io/docs/objc/latest/#indexed-properties 如果你尝试,它会抛出一个错误。

我们需要查询模型的关系和另一个属性。

通常你会通过覆盖(foreign_id,property)覆盖索引来做到这一点,但这在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,并在其上创建索引?

干杯

1 个答案:

答案 0 :(得分: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标记为索引属性,理论上这应该非常快。但是既然你已经提到过你有数以千计的页面内容,我很想知道这会是什么样的真实表现。