gpt4 book ai didi

sql - 分配用户角色的首选数据库设计方法? (帽子与组)

转载 作者:行者123 更新时间:2023-12-04 11:18:07 26 4
gpt4 key购买 nike

我有一个中等大小的 MySQL 数据库,其中包含一个主要的“人员”表,其中包含连接到剧院和戏剧学校的每个人的基本联系信息,我负责维护和开发许多 Web 应用程序。

有些人只是联系人——也就是说,他们的“persons”表记录是我们需要存储的关于他们的所有信息。许多其他人虽然必须能够为各种系统承担不同的角色。其中,大多数都是从学生开始的。有些人从员工开始。学生可以成为实习生或表演者;员工可以成为学生;所有教师都是雇员和表演者等。

从本质上讲,它们是任何个人可能必须佩戴的各种不同的“帽子”,以便访问系统的不同部分并与之交互,以及在我们网站的公共(public)页面上提供有关它们的信息。

我对实现这个模型的选择是有几个其他的表来代表这些“帽子”——这些表包含补充基本“人”信息的元信息,所有这些都使用“人”ID作为他们的主键。例如,作为教师的人在教师表中有一条记录,其中包含他或她的简短传记信息和工资率。所有教师也是员工(但并非所有员工都是教师),这意味着他们在员工表中有一个记录,允许他们将工作时间提交到我们的工资系统中。

我的问题是,这样实现模型有什么缺点?我能想到的唯一其他选择是用对于大多数条目来说是空的且无用的字段来扩充persons表,然后有一个人可以属于的繁琐的“组”表,然后为每个人提供几乎每个表系统有个人person_id外键,然后依赖业务逻辑来验证所引用的person_id是否属于合适的组;但这很愚蠢,不是吗?

下面是一些示例表声明,希望它们可以展示我当前如何将所有这些放在一起,并希望说明为什么我认为这是一种更明智的方式来模拟系统必须处理的各种情况的现实。

欢迎任何和所有的建议和意见。我很感激你的时间。

编辑 一些受访者提到了使用 ACL 来保证安全性——我在最初的问题中没有提到我实际上是在使用单独的 ACL 包来对不同系统的实际用户进行细粒度的访问控制。我的问题更多是关于在数据库模式中存储有关人员的元数据的最佳实践。

CREATE TABLE persons (
`id` int(11) NOT NULL auto_increment,
`firstName` varchar(50) NOT NULL,
`middleName` varchar(50) NOT NULL default '',
`lastName` varchar(75) NOT NULL,
`email` varchar(100) NOT NULL default '',
`address` varchar(255) NOT NULL default '',
`address2` varchar(255) NOT NULL default '',
`city` varchar(75) NOT NULL default '',
`state` varchar(75) NOT NULL default '',
`zip` varchar(10) NOT NULL default '',
`country` varchar(75) NOT NULL default '',
`phone` varchar(30) NOT NULL default '',
`phone2` varchar(30) NOT NULL default '',
`notes` text NOT NULL default '',
`birthdate` date NOT NULL default '0000-00-00',
`created` datetime NOT NULL default '0000-00-00 00:00',
`updated` timestamp NOT NULL,
PRIMARY KEY (`id`),
KEY `lastName` (`lastName`),
KEY `email` (`email`)
) ENGINE=InnoDB;

CREATE TABLE teachers (
`person_id` int(11) NOT NULL,
`bio` text NOT NULL default '',
`image` varchar(150) NOT NULL default '',
`payRate` float(5,2) NOT NULL,
`active` boolean NOT NULL default 0,
PRIMARY KEY (`person_id`),
FOREIGN KEY(`person_id`) REFERENCES `persons` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;

CREATE TABLE classes (
`id` int(11) NOT NULL auto_increment,
`teacher_id` int(11) default NULL,
`classstatus_id` int(11) NOT NULL default 0,
`description` text NOT NULL default '',
`capacity` tinyint NOT NULL,
PRIMARY KEY(`id`),
FOREIGN KEY(`teacher_id`) REFERENCES `teachers` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY(`classstatus_id`) REFERENCES `classstatuses` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE,
KEY (`teacher_id`,`level_id`),
KEY (`teacher_id`,`classstatus_id`)
) ENGINE=InnoDB;

CREATE TABLE students (
`person_id` int(11) NOT NULL,
`image` varchar(150) NOT NULL default '',
`note` varchar(255) NOT NULL default '',
PRIMARY KEY (`person_id`),
FOREIGN KEY(`person_id`) REFERENCES `persons` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;

CREATE TABLE enrollment (
`id` int(11) NOT NULL auto_increment,
`class_id` int(11) NOT NULL,
`student_id` int(11) NOT NULL,
`enrollmenttype_id` int(11) NOT NULL,
`created` datetime NOT NULL default '0000-00-00 00:00',
`modified` timestamp NOT NULL,
PRIMARY KEY(`id`),
FOREIGN KEY(`class_id`) REFERENCES `classes` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY(`student_id`) REFERENCES `students` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY(`enrollmenttype_id`) REFERENCES `enrollmenttypes` (`id`)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;

最佳答案

去年我也经历过类似的事情。问题是:我们是显式地还是一般地建模我们的实体?在您的示例中,这意味着实体/表格(例如教师、学生等)之间是否存在直接关系。

最后我们选择了一个通用的“Party”模型。党模型如下:

  • 一个 派对 代表个人或组织;
  • 大多数Party 类型都有一个依赖表来存储取决于Party 类型的额外信息,例如Person、Organization、Company;
  • 学生或老师之类的东西是 党的角色 .一个当事人可以有任意数量的当事人角色。例如,一个人可能既是教师又是学生;
  • 类之类的东西被处理为 政党角色关系 .例如,教师和学生角色之间的关系表示类关系;
  • 参与方角色关系可以具有额外信息的子类型。您的模型中的师生关系是一种注册,它可能具有您所说的额外属性;
  • 当事人之间没有直接关系 .只有当事方角色相互关联;和
  • 对于常见的信息分组,如果有帮助,我们会创建 View ,因为 SQL 可能有点复杂,因为关系更加间接(例如,在教师和学生的党实体之间存在三个表)。

  • 这是一个非常强大的模型,在 CRM 类型系统中非常常见。这个模型几乎来自 "The Data Model Resource Book: Volume 1" ,这是处理此类事情的绝佳资源。

    关于sql - 分配用户角色的首选数据库设计方法? (帽子与组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/425711/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com