管理员和员工具有类似角色的数据库设计(管理员除外)可以查看所有其他员工数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了管理员和员工具有类似角色的数据库设计(管理员除外)可以查看所有其他员工数据相关的知识,希望对你有一定的参考价值。

我们正在构建一个具有Admin和Employee概念的系统。所以基本上Admin是一个拥有所有权力的员工,可以查看其他员工创建的所有数据。

CREATE TABLE `Vendor` (
  `vendor_Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(40) NOT NULL,
  `email_Id` varchar(40) DEFAULT NULL,
  `landline_Number` varchar(15) DEFAULT NULL,
  `mobile_Number` varchar(15) DEFAULT NULL,
  `address_Line1` varchar(65) NOT NULL,
  `address_Line2` varchar(65) DEFAULT NULL,
  `city` varchar(255) NOT NULL,
  `pincode` int(6) NOT NULL,
  `country` varchar(255) NOT NULL,
  PRIMARY KEY (`vendor_Id`),
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1

CREATE TABLE `Employee` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `vendor_Id` int(10) unsigned DEFAULT NULL,
  `name` varchar(40) NOT NULL,
  `username` varchar(40) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `role` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `employee_username_unique` (`username`),
  KEY `employee_vendor_id_foreign` (`vendor_Id`),
  CONSTRAINT `employee_vendor_id_foreign` FOREIGN KEY (`vendor_Id`) REFERENCES `Vendor` (`vendor_Id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1


CREATE TABLE `Action` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `emp_Id` int(10) unsigned DEFAULT NULL,
  `name` varchar(60) NOT NULL,
  `assigned_To` varchar(40) DEFAULT NULL,
  `deadline` datetime(3) NOT NULL,
  `notes` varchar(400) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `action_emp_id_foreign` (`emp_Id`),
  CONSTRAINT `action_emp_id_foreign` FOREIGN KEY (`emp_Id`) REFERENCES `Employee` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1

还有其他表Roles和EmployeeRoles我认为这里不需要。

方法1:现在,当管理员登录以查看每个人创建的所有操作时

  1. 我们首先需要查询Employee表以查找该Vendor的所有员工(当admin / employee登录时,我们将在会话中存储Vendor_Id)
  2. 然后在Action表中查询步骤1中employee_Id数组中的位置

这是一个好方法吗?

方法2:或者在Action表中,我将为每条记录存储Vendor_Id(主要是所有这些努力,以便当Admin登录时我可以轻松检索该供应商的所有记录。当Admin从会话登录时,我可以很容易地找到Vendor_Id并查询Action表。

我现在还不知道哪种方法更好。有什么建议 ?与Action类似,还有其他3个表需要应用类似的概念。

编辑1:可能存在这样的情况:我们可以在Single品牌(未来扩展)下注册多个供应商,而Super-Admin希望分析多个分支机构的数据。

答案

第一种方法是基本的标准化方法。当您将vendor_id放入会话时,您还可以将employee数组(具有属于该供应商的emp_ids)放入会话或缓存中。在这里,您不必一次又一次地查询,因为当会话或缓存过期时它将被刷新。

第二种解决方案是非规范化的解决方案。在这里你会遇到基于一致性的问题。在更新每个供应商id-empid映射时,您还需要更新操作表。

因此,您必须将写入查询的数量与读取查询进行比较。如果读取查询太高,那么请使用秒。但我想在一个小规模的组织中只有1-2个管理员。我会和Ist一起去,直到遇到一些严重的性能问题。

另一答案

您可以坚持使用解决方案1.使用employee表中Vendor id的索引,您应该使用带有actions表的内部联接。(除非您计划在表中有数百万行并且期望具有性能单位数毫秒级别)

以上是关于管理员和员工具有类似角色的数据库设计(管理员除外)可以查看所有其他员工数据的主要内容,如果未能解决你的问题,请参考以下文章

[数据库设计]用户和角色:通用权限管理系统数据库表结构如何设计?

java+swing+mysql员工工资管理系统设计分析

模块化流程再造

如何将用户登录作为角色功能?

软件工程课程设计指导随笔

权限管理设计------之数据库设计