2017-08-23 95 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您的对象。

相关问题