Realm 移动平台架构——千界 VS 大界文件

Realm Mobile Platform Architecture - Thousands of realms VS big realm files

我一直在尝试查找有关使用 Realm Mobile Platform 正确构建数据的最佳方法的一些信息,但我找不到相关的架构文档。

让我们考虑以下场景:

我的数据库包含 50 种不同语言的 100,000 部电影数据 + 对于每部电影,我在 50 个不同国家/地区的 10 个 VOD 平台上都有可用性。

一个用户只对几部电影(可能是所有电影)感兴趣,但只用他的语言,他可能只需要在他自己的国家/地区使用 3 个 VOD 平台。

只依赖一个领域文件似乎很荒谬,因为它将在所有用户设备上完全同步,因此它带来的可能性很小:

解决方案 1

50 个电影领域:每种语言 1 个,包含所有(100,000)部电影

50 个可用性领域:每个国家 1 个,包含所有(100,000)部电影的所有(10 个 VOD 提供商)可用性

+ 没有数据重复,所有电影都存储在本地(本地搜索,...)

- 要保持同步的大领域文件

解决方案 2

100,000 个电影领域:每部电影 1 个,包含所有 (50) 种语言和所有(10 个 VOD 平台 * 50 个国家/地区)可用性

+ 只同步需要的电影 -> 没有大的初始下载

- 每次在应用中显示电影时都需要检索(并保持同步?)新领域,存储在 phone 上的不需要的数据(不需要的语言和国家)

解决方案 3

每个元组 1 个电影领域(idMovie、语言、国家/地区):100,000 * 50 * 50 = 250,000,000 个领域

+ 仅同步 phone.

上需要的内容

- 巨大的数据重复(相同语言不同国家 -> 电影数据重复 + 相同国家不同语言 -> 可用性数据重复),很多领域需要维护(如何领域服务器对此有反应吗?)

解决方案 4

每个元组(语言、国家/地区)1 个电影领域,包含每部电影的可用性:50 * 50 = 2,500 个领域

+ phone 上没有不需要的数据,本地提供所有电影

- 同一国家/地区的重复可用性 - 不同的语言领域

解决方案 5

每个元组 1 个电影领域(电影、语言):100,000 * 50 = 5,000,000 个领域

每个元组 1 个可用性领域(可用性、国家/地区):100,000 * 50 = 5,000,000 个领域

+ phone 上没有不需要的数据,所有电影都在本地可用,没有重复数据

- 所有电影和可用性应在首次启动时下载并保持同步

PS:请注意,在每个解决方案中,我都将所有 VOD 提供商存储在用户的设备上,即使他不需要它......示例中为 10,但在美国很容易为 100 .

解决方案 1 似乎是最合适的,但假设电影(和电视节目...)的数量增长到 100 万或更多,这是唯一的解决方案很多下载是分裂!唯一的方法是使用解决方案 5,如果有 100 万部电影,总共需要维护 1 亿个领域文件。

Realm 移动平台是如何设计的?避免不必要的服务器过载并保持最佳用户体验的最佳解决方案是什么?

谢谢!

免责声明:我不是官方消息来源!

RMP 1.x 需要通过构建正确的同步配置并将其存储在不同的 Realm 中来手动管理您要同步的内容,因为您必须同步整个 Realm 文件才能从中进行查询。这使得上述任一解决方案都有些棘手。


随着Realm Mobile Platform 2.0(2017-10-17)的正式发布,这个其实应该很简单了。

来自docs

Part of Realm Platform 2.0, we are launching a preview of partial synchronization. This is a new and exciting capability where client applications can dynamically request data from Realm Object Server by registering queries.

This is a major change in how application developers can use Realm in their apps. Previously, applications would need to segment their data into multiple Realms to control which data is synced at a given time. Now this can be done entirely in a single Realm!

神奇之处在于:

  • SyncConfiguration 具有 partialRealm()partial(或类似名称)属性

    Realm.open({
        sync: {
            url: `realm://${URL}/tickers`,
            user: user,
            partial: true
        },
        schema: [TickerSchema],
    })
    
  • Realm 有一个 subscribeToObjects() 方法可以接收查询定义(Java 预览 api 也使用 Javascript 查询语言写作时间在4.0.0):

    realm.subscribeToObjects('Ticker', 'price > ' + price)
    

在 JS 世界中它 returns 一个 promise 所以你可以做到 .then((results, error) => {,

在 Obj-C 和 Java 中,您似乎必须使用回调来接收 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)

回调 returns 一个 Results,您可以向其添加通知块/更改侦听器。在 Java 中,您应该确保存储了对 RealmResults 的引用。