【发布时间】:2017-12-19 13:31:15
【问题描述】:
我们正在构建一个具有管理员和员工概念的系统。所以基本上管理员是一个拥有所有权力的员工,可以查看其他员工创建的所有数据。
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。
方法一:现在,当管理员登录查看每个人创建的所有操作时
- 我们首先需要查询 Employee 表以查找该 Vendor 的所有员工(当管理员/员工登录时,我们会将 Vendor_Id 存储在会话中)
- 然后使用步骤 1 中的employee_Id 数组中的 where 查询 Action 表
这是一个好方法吗?
方法 2 :或者在 Action 表中,我将为每条记录存储 Vendor_Id(主要是所有这些工作,以便在管理员登录时我可以轻松检索该供应商的所有记录。当管理员从 session 登录我可以轻松找到 Vendor_Id 并查询 Action 表。
目前我不知道哪种方法更好。有什么建议么 ? 与 Action 一样,还有其他 3 个表需要应用类似的概念。
编辑 1:可能会有多个供应商在一个品牌下注册(未来扩展),并且超级管理员想要跨多个分支机构分析数据。
【问题讨论】:
标签: mysql database database-design