我正在研究在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文档,特别是关于多领域和访问控制。
解决方案是让每个用户在他们的移动设备上创建共享领域。每个用户的领域将与对象服务器同步。并且用户的朋友将获得对该领域的读取权限。
因此,user1可以查看他朋友的所有任务。伪代码将类似于:
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 :(得分:0)
Realm是一个对象数据库,而不是一个关系数据库。这意味着您不必将对象映射到表中的行,但可以将对象直接存储在数据库中。它在general terms here中描述。
像Realm这样的对象数据库正在使用classes as data model,在您的情况下,您需要一个用于User
,一个用于Task
。用户的任务可以是modelled as a relationship,而不是在关系数据库中使用主/外键和连接。同样,关系可用于模拟两个用户之间的友谊。
Realm可以是本地数据库,也可以使用后端基础架构或其他移动设备连接到Realm对象服务器和synchronize对象。