2017-09-01 102 views
0

區域:跨多個領域的關係?

我們有以下場景:有幾個商店有員工和客戶,有幾個員工可以在多個商店工作,有幾個客戶可以在多家商店購物。這可能與這些類

class Store { 
    dynamic var id = "" 
    dynamic var address = "" 
    let workers = List<Employee>() 
    let customers = List<Customer>() 
} 

class Customer { 
    dynamic var id = "" 
    dynamic var name = "" 
    let stores = LinkingObjects(fromType: Store.self, property: "customers") 
    // ... many more fields about this customer 
} 

class Employee { 
    var id 
    var name 
    let work = LinkingObjects(fromType: Store.self, property: "workers") 
} 

這裏美中不足的是,我們必須保護客戶信息,所以沒有客戶信息都可以存在於共享的領域和需要是安全的代表。商店和員工數據都不是安全問題。我們目前的做法是爲每個客戶提供他們自己的領域,然而,主要缺點是需要大量複製,因爲每個客戶領域都必須複製商店的數據。另一個缺點是我們會將客戶數據複製到具有安全風險的共享領域。構建這種允許跨不同領域的關係的場景的最佳方式是什麼?

回答

1

領域當前不支持跨領域的「直接」對象鏈接,類似於同一領域內的對象屬性。

相反,你做什麼,我的建議是給你的對象主鍵(你可能只需要申報現有id領域等,或者創建一個新的internalId場現有id字段不能用於此目的)。

主鍵是強制性的,必須是唯一的,並且在設置後不能更改,這使得它們對於唯一標識對象非常有用。 Our documentation更詳細地討論它們。

然後,您可以直接將相關客戶的主鍵存儲在列表中,而不是直接將客戶信息/客戶對象存儲在共享區域中。 (現在你必須製作一個包裝對象來存儲客戶的主鍵,但我們計劃支持直接包含字符串或其他原始類型的集合)

您可以通過添加你的對象上的helper方法可以在客戶Realm中傳遞,並返回用戶對象(或任何對象的主鍵被存儲),自動在Realm中查找它。您可以使用Realmobject(ofType:forPrimaryKey)方法根據其主鍵查找對象。

主要的限制是你不會自動更新鏈接,你會得到的對象,列表和LinkingObjects屬性。您必須自己手動執行簿記。

如果您有想在Realm中看到的功能想法,那將超出我在此發佈的內容,請隨時通過我們的GitHub issue tracker分享您的想法。我們歡迎功能要求。

+0

很好的迴應。但是,如果我們以客戶身份登錄並希望查看我要訪問的商店的客戶列表,那麼可能需要打開100個不同的領域,然後查詢相應的用戶對象,我覺得這樣的效率會非常低(除非你知道否則?)。另外,這在移動設備上甚至可以實現,因爲它沒有Realm.Sync.adminUser方法,像realm-js lib中可能的方法那樣? –