很抱歉一个大问题,但我无法用更少的信息来解释我的情况 我设计了一个类似这样的数据库系统:
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记录)。
现在我的问题是:
如您所见,用户拥有不同的权限,根据他们当前所属的组以及管理员应用的权限,现在我必须以每个用户对不同项目具有不同权限的方式推进此系统(server
,producer
和record
),如果用户具有对项目的显式权限,则使用该权限,否则使用来自父级的权限以及至少用户的全局权限。例如,record
的用户权限将从应用于record
,producer
,其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。
现在任何人都可以指导我完成任务!?
答案 0 :(得分:2)
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)