我一直试图找到一些有关使用Realm Mobile Platform正确构建数据的最佳方法的信息,但我无法找到相关的架构文档。
让我们考虑以下情况:
我的数据库包含100,000部电影,其中包含50种不同语言的数据+每部电影我在50个不同国家/地区的10个视频点播平台上都可以使用。
一个用户只对他的语言感兴趣的几部电影(可能是所有电影),他可能只需要在自己的国家/地区提供3个VOD平台的可用性。
仅仅依赖一个领域文件似乎很荒谬,因为它将在所有用户设备上完全同步,因此它带来的可能性很小:
解决方案1
50个电影领域:每种语言1个包含所有(100,000)个电影
50个可用域:每个国家1个包含所有(10个VOD提供商)所有(100,000个)电影的可用性
+ 没有数据重复,所有电影都存储在本地(本地搜索,...)
- 要保持同步的大域文件
解决方案2
100,000个电影领域:每部电影包含所有(50)种语言和所有(10种视频点播平台* 50个国家/地区)可用的电影
+ 仅同步所需的电影 - >没有大的初始下载
- 每次在应用中显示电影时都需要检索(并保持同步?)新领域,手机上存储的不需要的数据(不需要的语言和国家/地区)
解决方案3
每个元组1个电影领域(idMovie,语言,国家):100,000 * 50 * 50 = 250,000,000领域
+ 仅同步手机上所需的内容。
- 大量数据重复(同一语言不同国家/地区 - >电影数据重复+同一国家/地区不同语言 - >可用性数据重复),维护的领域很多(领域服务器如何反应)那个?)
解决方案4
每个元组(语言,国家)的1个电影领域,包含每部电影的可用性:50 * 50 = 2,500个领域
+ 手机上没有不需要的数据,所有电影都在本地播放
- 相同国家/地区的可用性重复 - 不同语言领域
解决方案5
每个元组1个电影领域(电影,语言):100,000 * 50 = 5,000,000领域
每个元组1个可用性域(可用性,国家/地区):100,000 * 50 = 5,000,000领域
+ 手机上没有不需要的数据,所有本地电影都可用,没有重复数据
- 所有电影和可用性应在首次发布时下载并保持同步
PS:请注意,在每个解决方案中,我将所有VOD提供商存储在用户的设备上,即使他不需要它......在示例中它只有10个,但可以很容易100美国。
解决方案1 似乎是最合适的,但让我们说电影(和电视节目......)的数量增长到100万或更多,这是唯一的解决方案,如果这样做&#39 ;太多下载就是拆分!唯一的方法是使用解决方案5 ,并且使用100万部电影,总共需要维护1亿个领域文件。
如何设计Realm移动平台以及什么是避免不必要的服务器过载以及保持最佳用户体验的最佳解决方案?
谢谢!
答案 0 :(得分:1)
免责声明:我不是官方消息来源!
RMP 1.x需要通过构建正确的同步配置并将其存储在不同的Realm中来手动管理要同步的内容,因为您必须同步整个Realm文件才能从中进行查询。这使得上述任一解决方案都有些棘手。
随着Realm Mobile Platform 2.0(2017-10-17)的正式发布,这实际上应该非常简单。
来自docs:
Realm Platform 2.0的一部分,我们正在推出部分预览 同步。这是客户端新的令人兴奋的功能 应用程序可以动态地从Realm Object Server请求数据 注册查询。
这是应用程序的重大变化 开发人员可以在他们的应用中使用Realm。以前,应用程序会 需要将他们的数据分成多个领域来控制哪些数据 在给定时间同步。现在,这可以完全在一个单独完成 境界!
神奇之处在于:
SyncConfiguration有一个partialRealm()
或partial
(或类似命名的)属性
Realm.open({
sync: {
url: `realm://${URL}/tickers`,
user: user,
partial: true
},
schema: [TickerSchema],
})
Realm有一个subscribeToObjects()
方法可以接收查询定义(Java预览api在4.0.0编写时也使用Javascript查询语言):
realm.subscribeToObjects('Ticker', 'price > ' + price)
在JS世界中,它会返回一个承诺,因此您可以.then((results, error) => {
,
RealmResults
。
OBJECTIVE-C
- (void)subscribeToObjects:(nonnull Class)type
where:(nonnull NSString *)query
callback:(nonnull RLMPartialSyncFetchCallback)callback;
SWIFT
func subscribe(toObjects type: AnyClass, where query: String, callback: @escaping RLMPartialSyncFetchCallback)
JAVA
void subscribeToObjects(Class<E> clazz, String query, Realm.PartialSyncCallback<E> callback)
回调返回Results
,您可以添加通知块/更改侦听器。在Java中,您应该确保将引用存储到RealmResults。