2017-01-23 66 views
0

我是相当新的境界,我试图找出我的REST API之间的相互作用正确的设计,并存储到境界的对象。到目前为止,我有一个Animal物体看起来像如下:两个连接关系对象

class Animal: Object, Mappable { 
    dynamic var id = "" 
    dynamic var userId = "" 
    dynamic var name = "" 
    dynamic var gender = "" 
    dynamic var breed: Breed? 
    dynamic var type: Type? 

    //extra 
    var mainPhotoIndex = 0 


    override static func primaryKey() -> String? { 
     return "id" 
    } 


    required convenience init?(map: Map) { 
     self.init() 
    } 

} 

但问题是,我不知道我该怎么处理TypeBreed关系,因为类型包括所有的品种,这意味着名单中为了检索与相应的品种名称的动物,并键入名字,我将不得不填充在服务器端这两个属性,这将使JSON对象巨大的时候我的动物对象上只需要检索Type的两个名字和Breed。我发现的另一种方法是保存String ObjectId,然后在领域数据库中通过该ID进行筛选,但不确定这是否是最佳做法。那么我需要在服务器端传递什么信息?我应该如何设计我的动物领域对象?

类型

class Type: Object, Mappable { 
    dynamic var id = "" 
    dynamic var name = "" 
    var breeds = List<Breed>() 

    override static func primaryKey() -> String? { 
     return "id" 
    } 

    required convenience init?(map: Map) { 
     self.init() 
    } 

} 

品种

class Breed: Object, Mappable { 
    dynamic var id = "" 
    dynamic var name = "" 

    override static func primaryKey() -> String? { 
     return "id" 
    } 

    required convenience init?(map: Map) { 
     self.init() 
    } 

} 
+0

你的类定义是正确的。为了解决巨大的JSON问题,当您向/从服务器发布/检索它时,您可以为Type和Breed提供一个ID。 所有类型和品种已经坚持本地数据库从你的/端点类型,这样你就可以通过ID,创建一个特定的动物时找回它们,并将它们分配为您的动物的属性。 –

+0

我想过那只是不确定保存身份证的字符串是在领域的良好做法 –

+0

为什么要保存为字符串呢?整数可能是正确的选择 –

回答

0

你是完全正确的。您的架构是建立在以正确的方式,但你从一个JSON字符串映射Animal是正确的就需要有从TypeBreed包括一切为好。但是应该可以在这方面妥协。

听起来像TypeBreed是两套完全静态的数据,几乎独立于Animal。他们也有主键。这一切都这样的话,我会建议下载所有的Breed并且您需要Type内容和本地保存到境界你第一次需要。

在此之后,每当你请求Animal,JSON字符串而不是包括BreedType对象的内容的内容可以简单地代替包含必要的对象的主键。然后,在ObjectMapper中执行映射操作时,可以手动获取这两个键,查询Realm以获取适当的对象,然后在磁盘上完全在本地链接它们。

相关问题