让我们深入了解我们要创建的目标。
我们的目标是开发一个多功能平台,多个租户和用户可以无缝共处。
为了说明,请考虑我们在此平台上的最初租户集:汽车爱好者,猫主人和音乐家。
这是有趣的地方:
一个用户可以同时成为其中一个或多个租户的成员。
这意味着一个用户可能会自豪地戴着猫主和汽车爱好者的帽子,而另一个用户可能同样对音乐和汽车充满热情。
此外,在每个租户中,用户可以持有不同的权限。
例如,用户可能会喜欢在汽车爱好者领域中的完整阅读和写入访问,但可能只有在音乐家的领域中拥有读取特权。
为了简化权限管理,我们将将其组织成用户角色。
我们还希望能够单独为每个租户创建用户角色。
定义基本数据表
让我们将基础数据结构转换为超级Ql。
虽然SustrealQl通常不需要明确的表定义,但是这样做可以增强我们对过程的理解。
此外,我们将将模式定义纳入线条以增强数据完整性。
-- Define the user table
DEFINE TABLE user SCHEMALESS;
-- Define the tenant table
DEFINE TABLE tenant SCHEMALESS;
-- Define the permission table
DEFINE TABLE permission SCHEMALESS;
-- Define the role table
DEFINE TABLE role SCHEMALESS;
插入许可
在我们的教程中,我们将拥有权限创建,阅读,更新和删除。
插入数据类似于常规SQL。您可以使用koude0语句或sursealdB语句koude1。
-- insert the create permission
CREATE permission:create SET name = 'create content';
-- insert the read permission
CREATE permission:read SET name = 'read content';
-- insert the update permission
CREATE permission:update SET name = 'update content';
-- insert the delete permission
CREATE permission:delete SET name = 'delete content';
插入角色
创建角色本身类似于创建许可。但是,在这种情况下,我们还旨在将角色与权限联系起来。
SurseAldB提供了koude2声明。这将带来一整套的图形功能。
-- insert the reader role
CREATE role:reader SET name = 'Content Reader';
-- create a relation from role reader to read permission
RELATE role:reader->role_permission->permission:read;
我们将在称为cole_permission的表中跟踪角色和权限之间的关系。该表有两个基本字段:内外。
将该表中的数据视为存储的路线图作为有向图。
在我们的示例中,这种联系从角色到权限。
请记住此细节,因为当我们以后检索数据时,它将变得至关重要。
有了这些知识,我们可以添加更多的角色。
-- insert the creator role
CREATE role:author SET name = 'Content Author';
-- create a relation from role author to permissions
RELATE role:author->role_permission->permission:read;
RELATE role:author->role_permission->permission:create;
RELATE role:author->role_permission->permission:update;
-- insert the admin role
CREATE role:admin SET name = 'Administrator';
-- create a relation from role admin permissions
RELATE role:admin->role_permission->permission:read;
RELATE role:admin->role_permission->permission:create;
RELATE role:admin->role_permission->permission:update;
RELATE role:admin->role_permission->permission:delete;
插入租户
正如我们现在拥有的权限和角色一样,我们现在可以创建我们的房客。
这很简单。
我们创建租户条目本身,然后将角色与特定的租户联系起来。
牢记角色到租户的方向。
-- create the tenant for our car enthusiasts
CREATE tenant:car SET name = 'Car Enthusiasts';
RELATE role:admin->tenant_role->tenant:car;
RELATE role:author->tenant_role->tenant:car;
RELATE role:reader->tenant_role->tenant:car;
-- create the tenant for our cat owners
CREATE tenant:cat SET name = 'Cat Owners';
RELATE role:admin->tenant_role->tenant:cat;
RELATE role:author->tenant_role->tenant:cat;
RELATE role:reader->tenant_role->tenant:cat;
-- create the tenant for our musicians
CREATE tenant:musician SET name = 'Musicians';
RELATE role:admin->tenant_role->tenant:musician;
RELATE role:author->tenant_role->tenant:musician;
RELATE role:reader->tenant_role->tenant:musician;
插入用户
要包装内容,让我们在数据库中添加一些用户条目。我们首先创建一个用户实体条目。默认情况下,surseAldB返回了整个新创建的条目,从而使我们能够将此结果保存在以供将来使用的变量中。
接下来,我们使用此存储的结果来建立用户与租户之间的关系。建立这种关系遵循与常规进入创建相似的过程,结果我们再次收到一个完整的实体,我们可以将其存储在另一个变量中。
最后,在最后一步中,我们建立了从用户到租户关系到角色输入的关系,完成了我们数据库中的连接。
-- create the user
LET $createdUser = (CREATE user:1 SET
name='John Doe',
firstName = 'John',
lastName = 'Doe',
email='john.doe@example.com');
-- link the user John Doe to the tenant "car enthusiasts"
LET $memberRelation = (RELATE $createdUser->tenant_member->tenant:car);
-- link the member relationship to a role
RELATE $memberRelation->member_role->role:author;
-- finally, return the newly created user
RETURN $createdUser;
结构
这是数据结构的图表:
这是完整的代码。
您可以使用surrealist.app运行SurstealQl。
-- Define the user table
DEFINE TABLE user SCHEMALESS;
-- Define the tenant table
DEFINE TABLE tenant SCHEMALESS;
-- Define the permission table
DEFINE TABLE permission SCHEMALESS;
-- Define the role table
DEFINE TABLE role SCHEMALESS;
-- insert the create permission
CREATE permission:create SET name = 'create content';
-- insert the read permission
CREATE permission:read SET name = 'read content';
-- insert the update permission
CREATE permission:update SET name = 'update content';
-- insert the delete permission
CREATE permission:delete SET name = 'delete content';
-- insert the reader role
CREATE role:reader SET name = 'Content Reader';
-- create a relation from role reader to read permission
RELATE role:reader->role_permission->permission:read;
-- insert the creator role
CREATE role:author SET name = 'Content Author';
-- create a relation from role author to permissions
RELATE role:author->role_permission->permission:read;
RELATE role:author->role_permission->permission:create;
RELATE role:author->role_permission->permission:update;
-- insert the admin role
CREATE role:admin SET name = 'Administrator';
-- create a relation from role admin permissions
RELATE role:admin->role_permission->permission:read;
RELATE role:admin->role_permission->permission:create;
RELATE role:admin->role_permission->permission:update;
RELATE role:admin->role_permission->permission:delete;
-- create the tenant for our car enthusiasts
CREATE tenant:car SET name = 'Car Enthusiasts';
RELATE role:admin->tenant_role->tenant:car;
RELATE role:author->tenant_role->tenant:car;
RELATE role:reader->tenant_role->tenant:car;
-- create the tenant for our cat owners
CREATE tenant:cat SET name = 'Cat Owners';
RELATE role:admin->tenant_role->tenant:cat;
RELATE role:author->tenant_role->tenant:cat;
RELATE role:reader->tenant_role->tenant:cat;
-- create the tenant for our musicians
CREATE tenant:musician SET name = 'Musicians';
RELATE role:admin->tenant_role->tenant:musician;
RELATE role:author->tenant_role->tenant:musician;
RELATE role:reader->tenant_role->tenant:musician;
-- create the user
LET $createdUser = (CREATE user:1 SET
name='John Doe',
firstName = 'John',
lastName = 'Doe',
email='john.doe@example.com');
-- link the user John Doe to the tenant "car enthusiasts"
LET $memberRelation = (RELATE $createdUser->tenant_member->tenant:car);
-- link the member relationship to a role
RELATE $memberRelation->member_role->role:author;
-- finally, return the newly created user
RETURN $createdUser;
我们现在有一个名为“约翰·杜”(John Doe)的用户,他是“汽车爱好者”租户的成员。他被任命为“作者”的角色,该角色赋予他“读取”,“创建”和“更新”的权限。
。在本教程的下一部分中,我们将仔细研究如何访问此信息。