2017-08-23 114 views
0

我正在研究在React Native應用程序中使用Realm,並且無法掌握領域概念,領域對象服務器以及如何設計我的數據庫。什麼是領域?

假設我們有三個表:

"User" with columns id (primary key), name (string) 
"Task" with columns id (primary key), user_id (foreign key to User), description (string) 
"Friendships" with columns id (primary key), user_id (foreign key to User), friend_user_id (foreign key to User) 

用戶可以使任務爲自己和看到他們朋友的任務,但只能編輯和刪除自己。所有這些用戶和任務將在其移動設備上創建並同步到服務器。

可以說,user1想看到他的朋友的所有任務。

從一個普通的SQL背景的人,我想像的JavaScript僞代碼將是這樣的:

var friends_list = [user2.id, user3.id, ...]; 
let realm = Realm.URL("...server url..."); 
let friends_tasks = realm.objects('Tasks').filtered('user_id in friends_list'); 

但是,如果我們只有一個境界,那麼爲了讓用戶能夠使他們的自己的任務,他們需要寫入訪問領域,因此也有權刪除其他用戶的任務。

查看Realm文檔,特別是關於多領域和訪問控制。

解決方案是爲每個用戶在其移動設備上創建共享領域。每個用戶的領域將與對象服務器同步。用戶的朋友將獲得對該領域的讀取權限。

因此,用戶1看到他所有的朋友的任務。僞代碼將是這樣的:

var friends_list = [user2.id, user3.id, ...]; 
var friends_tasks = []; 
foreach (user_id in friends_list) { 
    let realm = Realm.URL("...server_url/user_id/..."); 
    let tasks = realm.objects("Tasks"); 
    friends_tasks.push(tasks); 
} 

這是最好的設計?這只是感覺不對,不得不連接到不同的領域。

回答

0

領域是對象數據庫而不是關係數據庫。這意味着您不必將對象映射到表中的行,但可以將對象直接存儲在數據庫中。它在general terms here中描述。

像Realm這樣的對象數據庫使用的是classes as data model,對於您的情況,您需要一個用於User,另一個用於Task。用戶的任務可以是modelled as a relationship,而不是在關係數據庫中使用主鍵/外鍵和聯接。同樣,關係可以用來模擬兩個用戶之間的友誼。

領域可以是本地數據庫,也可以使用後端基礎結構或其他移動設備連接到Realm Object Server和synchronize您的對象。

相關問題