1

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

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"
);

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

现在我的问题是:
正如您所见,用户拥有不同的权限,根据他们当前属于哪个组以及管理员向他们应用了哪些权限,现在我必须以每个用户可能对不同项目具有不同权限的方式推进这个系统(server,producerrecord) 的方式是,如果用户对某个项目具有显式权限,则使用该权限,否则使用来自父级的权限和至少用户的全局权限。例如,用户对 a 的权限record将由应用到 that record、 its producer、 itsserver或为用户定义的权限的权限指示。

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

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管理员为记录设置特殊权限并且大多数记录应该使用他们的权限producer但使用这种技术我应该检查多个表的罕见情况每次访问records表。例如一个简单的查询,如:

SELECT * FROM "records" WHERE /* Some condition */ AND record_is_accessible( "ID" )

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

现在谁能指导我完成任务!?

4

1 回答 1

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 约束(如果需要)例如,假设您给服务器一个 EntityType = 1、Producer --> 2、Record --> 3 然后 EntityId 和 EntityType = 1 对服务器的引用等等。 ..

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

于 2012-10-23T11:06:56.257 回答