数据存储之间的依赖关系

时间:2016-02-03 10:08:15

标签: rest design-patterns client-server datastore

TL; DR

处理从不同后端端点异步加载的数据类型之间的依赖关系的最佳方法是什么?

问题

我的应用程序从后端获取数据,对于每个实体,我有一个端点来获取所有实例。 例如,api.myserver.com/v1/users模型为Userapi.myserver.com/v1/things模型为Thing

此数据将被解析并放入数据存储对象(例如UserDataStoreThingDataStore),以便将这些模型提供给应用程序的其余部分。

问题

如果来自/things的数据取决于来自/users的数据并且获取操作是异步的,我该怎么办?在我的情况下,/things会返回创建它们的用户的id。这意味着如果/things/users之前返回,那么我将无法获得足够的数据来创建Thing模型。

选项

  1. /things还返回相关的/users数据嵌套。

    这很糟糕,因为:

    • 然后我会为同一个实际用户设置多个模型实例User - 一个来自/users,另一个嵌套在/things
    • 增加传输的总有效负载大小。
    • 在具有某些权限策略的系统中,为/users返回的数据可能与/things不同,然后它允许部分填充的模型位于应用中。
  2. 在两个数据存储之间创建操作依赖关系,以便ThingsDataStore在尝试加载自己的数据之前必须等待UserDataStore填充。

    这也很糟糕,因为:

    • 设计明智,这种依赖不受欢迎。
    • 操作方面,一旦你投入另一个数据存储(例如依赖周期等),它将很快变得复杂。
  3. 对于我的问题以及一般情况,最佳解决方案是什么? 这显然不依赖于平台/语言。

1 个答案:

答案 0 :(得分:1)

我看到两种可能的解决方案:

  1. UserDataStoreThingDataStore的延迟初始化。您将不得不允许创建一个不完全有效的对象。您还需要添加方法,以便为您提供是否初始化UserDataStore的信息。不完美,因为有一段时间会存在无效的实例。

  2. ThingDataStore创建某种代理或buider对象,它将保存有关特定事物的所有信息,并在ThingDataStore与此相关时立即生成UserDataStore个对象将收到实例。

  3. 也许它会对你有所帮助。祝你好运!