【问题标题】:How to model users and administrators in a database?如何在数据库中为用户和管理员建模?
【发布时间】:2011-12-30 19:51:07
【问题描述】:

我对mysql很陌生。我想在 mysql 中为一所学校创建一个数据库。该数据库应存储教师的信息,并为其中一些教师提供创建小组的可能性。

所以我创建了一个数据库,其中包含一个表group 和一个表professeur。组与教师具有多对多关系,反之亦然,从而派生出另一个表Group_professeur。这是表的简单结构:

教授:

CREATE TABLE IF NOT EXISTS `professeur` (
  `id_professeur` int(11) NOT NULL AUTO_INCREMENT,
  `nom_professeur` varchar(50) NOT NULL,
  `prenom_professeur` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id_professeur`),
  UNIQUE KEY `LOGIN` (`login`),
  UNIQUE KEY `MDP` (`passwd`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=103 ;

CREATE TABLE IF NOT EXISTS `groupe` (
  `id_groupe` int(11) NOT NULL AUTO_INCREMENT,
  `nom_groupe` varchar(255) NOT NULL,
  `id_prof_responsable` int(11) NOT NULL,
  PRIMARY KEY (`id_groupe`),
  UNIQUE KEY `nom_groupe` (`nom_groupe`),
  KEY `id_prof_responsable` (`id_prof_responsable`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
ALTER TABLE `groupe`
ADD CONSTRAINT `fk_professeur_to_groupe` FOREIGN KEY (`id_prof_responsable`) REFERENCES `professeur` (`id_professeur`) ON UPDATE CASCADE

Groupe_has_teachers:

CREATE TABLE IF NOT EXISTS `groupe_professeur` (
  `id_groupe` int(11) NOT NULL,
  `id_professeur` int(11) NOT NULL,
  KEY `id_groupe` (`id_groupe`),
  KEY `id_professeur` (`id_professeur`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `groupe_professeur`
  ADD CONSTRAINT `groupe_professeur_ibfk_2` FOREIGN KEY (`id_professeur`) REFERENCES `professeur` (`id_professeur`) ON UPDATE CASCADE,
  ADD CONSTRAINT `groupe_professeur_ibfk_1` FOREIGN KEY (`id_groupe`) REFERENCES `groupe` (`id_groupe`) ON UPDATE CASCADE;

教师只能修改他们创建的小组(即他们可以在小组中插入和删除成员)。此外,并非所有教师都有权创建和修改小组。

创建表格后,我想知道谁会给他们适当的权限来做所有这些事情。我考虑过创建一个管理员。管理员可以授予某些教师创建和修改自己的组的权限,也可以撤销这些权限。

我创建了一个表来存储管理员,但管理员将授予管理员执行这些操作的必要权限。这让我回到了第一方。并且这个表可能与数据库中的其他表有一些关系,从而衍生出一些不必要的表。

无论如何,我考虑将professor 表更改为staffs 之类的一般名称,并将管理员添加到表中。然后将这些员工添加到数据库中。这意味着创建一个新员工对应于将员工的信息添加到表staffs,然后将该员工作为用户添加到数据库中。从那里我可以对每个用户使用像GRANTREVOKE 这样的SQL 函数。

我不确定这种方法是否非常有效,因为这意味着如果学校有 1000 名教授,那么它的数据库中就有 1000 名用户。 有没有什么有效的方法来解决这个问题?谢谢。

【问题讨论】:

  • 编程是一门艺术,您可以通过多种方式设计架构。对于您的答案,我没有正确或不正确的解决方案。即使你拥有的东西也适合我。
  • @EmmanuelN:哪种解决方案?您的意思是在数据库中为每个员工创建一个用户?

标签: php mysql database


【解决方案1】:

使用内置的 MySQL 用户概念控制应用程序用户访问是非正统的。对于基本应用程序,我建议在 group 表中为 owner_user_id 设置另一列,该列将引用教授表。然后在应用程序代码中,在更改组时检查该 ID。 祝你好运!

【讨论】:

  • 我确实有这样的专栏。这是id_prof_responsable(查看表格Group)。它引用了教授表行(即组)中的id_professor。这意味着教授是该表的所有者。但是我怎样才能实现教授只能在 php/mysql 中插入或删除他的组中的成员的事实呢?
  • 尝试这样的操作: function addMemberToGroup(currentUser,memberToAdd,group){ if(group->ownerId == currentUser->id) { //add member } else{ //处理未授权用户} }
  • 谢谢。我想我明白了它的范围。换句话说,当教授登录时,我必须在数据库中查询教授的 id 并将其与 groupe 的所有者 id 进行比较。如果它们相等,教授可以从该组中插入/删除成员。对吗?
  • 所以我不需要管理员之类的东西来授予某些教授创建组的权限吗?因为并非所有教授都有权创建一个。那我怎么知道某个教授可以创建一个小组呢?
  • 好的,这是一个不同的问题。您可以创建这些表:role (role int references role_type(id),user_id references Professors(id)), role_type(id int,type varchar);插入角色类型(1,'ADMIN');插入 roel_type(2,'GROUP_CREATOR');而不是用用户 admin 播种它们并创建一个屏幕,管理员可以在其中将行插入到组创建者的角色表中
【解决方案2】:

【讨论】:

  • 感谢您的链接。看来这个问题并没有我想的那么简单
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 2020-05-06
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
相关资源
最近更新 更多