文件系统类似于DBMS中的权限

时间:2012-10-23 10:50:07

标签: sql

很抱歉一个大问题,但我无法用更少的信息来解释我的情况 我设计了一个类似这样的数据库系统:

CREATE TABLE servers(
    ID bigint primary key not null
    /* other fields of the server */
);
CREATE TABLE producers(
    ID bigint not null,
    ServerID bigint not null,
    /* other field of the producer */
    constraint "PK_producers"
        primary key (ID, ServerID),
    constraint "FK_producer_servers"
        foreign key("ServerID") references "servers"
);
CREATE TABLE records(
    ID bigint primary key,
    ServerID bigint not null,
    ProducerID bigint not null
    /* other fields of record */
    constraint "FK_records_servers"
        foreign key("ServerID") references "servers"
    constraint "FK_records_producers"
        foreign key("ServerID", "ProducerID") references "producers"
);

CREATE TABLE groups(
    ID bigint not null primary key,
    GroupName nvarchar(50) not null,
    Permissions int not null
    /* other fields of the group */
);
CREATE TABLE users(
    ID bigint not null primary key,
    UserName nvarchar(50) not null unique,
    Permissions int not null
    /* other fields of user */
);
CREATE TABLE users_in_groups(
    UserID bigint not null,
    GroupID bigint not null,
    constraint "PK_users_in_groups" primary key (UserID, GroupID),
    constraint "FK_uig_users" foreign key("UserID") references "users",
    constraint "FK_uig_groups" foreign key("GroupID") references "groups"
);

数据将从records添加到producers,每个制作人每天可提供500~2000条记录,每个server通常有2~4个制作人,完全正常3~6台服务器。如您所见records表的增长速度非常快(我会定期存档一些数据并缩小数据库,但records表通常有> 100000记录)。

现在我的问题是:
如您所见,用户拥有不同的权限,根据他们当前所属的组以及管理员应用的权限,现在我必须以每个用户对不同项目具有不同权限的方式推进此系统(serverproducerrecord),如果用户具有对项目的显式权限,则使用该权限,否则使用来自父级的权限以及至少用户的全局权限。例如,record的用户权限将从应用于recordproducer,其server或为用户定义的权限的权限中指明。

作为第一个解决方法,我认为我将实现关系表,提供用户和各种对象之间的关系,如下所示:

CREATE TABLE user_server_permissions(
    UserID bigint not null,
    ServerID bigint not null,
    Permissions int not null,
    constraint "PK_usp" primary key ("UserID", "ServerID"),
    constraint "FK_usp_users" foreign key ("UserID") references "users",
    constraint "FK_usp_server" foreign key ("ServerID") references "servers"
);
CREATE TABLE user_producer_permissions(
    UserID bigint not null,
    ServerID bigint not null,
    ProducerID bigint not null,
    Permissions int not null,
    constraint "PK_upp" primary key ("UserID", "ServerID", "ProducerID"),
    constraint "FK_upp_users" foreign key ("UserID") references "users",
    constraint "FK_upp_server" foreign key ("ServerID") references "servers"
    constraint "FK_upp_producer" foreign key ("ServerID", "ProducerID") references "producers"
);
CREATE TABLE user_record_permissions(
    UserID bigint not null,
    RecordID bigint not null,
    Permissions int not null,
    constraint "PK_urp" primary key ("UserID", "ServerID"),
    constraint "FK_urp_users" foreign key ("UserID") references "users",
    constraint "FK_urp_record" foreign key ("RecordID") references "records"
);

但是使用这种方法确实会降低性能,因为我使用它的主表是records,并且管理员为记录设置特殊权限是一种罕见的情况,大多数记录应该使用来自{{{}的权限。 1}}但是使用这种技术我应该检查每个访问producer表的多个表。例如,一个简单的查询:

records

将杀死应该能够响应多个客户端的服务器!
我的大多数客户使用MSSQL作为DBMS,但很少有人使用MySQL或ORACLE。

现在任何人都可以指导我完成任务!?

1 个答案:

答案 0 :(得分:2)

乍一看,快速解决方案就是 没有3个单独的权限表。相反,你会有这个

CREATE TABLE user_entity_permissions(
    UserID bigint not null,
    EntityID bigint not null,
    EntityType int not null,
    Permissions int not null,
    constraint "PK_usp" primary key ("UserID", "EntityID"),
    constraint "FK_usp_users" foreign key ("UserID") references "users"
    --- Third FK constraint ---
    );

现在你想相应地塑造你的第三个Fk约束(如果需要) 例如,假设您给Servers一个EntityType = 1,Producer - > 2,记录 - > 3 然后EntityId和EntityType = 1引用服务器等等......

通过这种方式,您还可以使用EntityType对权限的优先级进行排序(例如,首先是1,然后是2,然后是3)