我目前正在为酒店开发一个网站。我要实现的其中一件事是工人-> 上级关系。在 MySQL 中这样做的最佳方法是什么?
我的意思是:厨师的上级是主厨,主厨的上级是班长,班长的上级是总经理。在员工表中,我可以使用上级员工的 ID 将字段设为上级,但我只能获得一个上级/上级角色;更重要的是,我无法检索经理在特定酒店管理的所有员工的列表。
我需要这方面的建议。
我目前正在为酒店开发一个网站。我要实现的其中一件事是工人-> 上级关系。在 MySQL 中这样做的最佳方法是什么?
我的意思是:厨师的上级是主厨,主厨的上级是班长,班长的上级是总经理。在员工表中,我可以使用上级员工的 ID 将字段设为上级,但我只能获得一个上级/上级角色;更重要的是,我无法检索经理在特定酒店管理的所有员工的列表。
我需要这方面的建议。
好吧,使用一个简单的邻接图(supervisor_id 指向employees 表),你当然可以做你想做的事,但它不会很有效,并且不会扩展到大量的人。
您可能想要的是实现一个嵌套集模型。这使您可以非常轻松地抓住向组织中任意人报告的每个人。
如果您在开发中足够早,您可能会考虑查看Doctrine ORM系统,它为模型提供了嵌套集行为,因此您不需要实现自己的。
编辑:Richard Knop 有一篇关于带有 php 示例代码的嵌套集的帖子,您可能会发现它比 Celko 的 100%-sql 示例更有帮助。
If you are dealing with shifts, then the shift manager will vary separately from the staff working on the shift. That is, this week, a chef might be working the lunch-time shift under one shift manager; next week, he might be working the evening shift under another manager. Be sure you keep such complexities in mind.
您可以通过在您的选项卡上执行此操作来获取经理管理的所有员工的列表:
SELECT * FROM employees WHERE `superior`='id goes here'
但是,如果您或想要制作多个上级,只需制作一个带有这样列的新表
superior, person
或者,如果您想像树一样显示它,只需在查询循环中执行
也许您最好创建一个带有角色/功能的附加表或列表并为每个功能分配级别,因此级别 4 将是级别 3 的直接老板等。
我建议使用嵌套集模型。但是说它只允许 1 人在他们之上有 1 名经理...
几年前我写了一篇关于这个的博客。好的,它在 MSSQL 中,但它应该转换为 MySQL 好的。
这显示了如何插入/移动/检索完整列表等。
您可以使用三个字段来执行此操作,一个“ID”和一个“托管 ID”范围(两个值)。这些 ID 不是基于任何真实的东西,它们只是为了描述层次结构。
然后,要查找所有托管员工,请选择经理的“托管 ID”范围内的每个 ID。高层经理的 ID 范围涵盖所有人,他下面的经理涵盖较小的范围,等等,一直到不管理任何人且范围仅包含他们自己的人。
这种设计的一个问题是,当您调整人员或添加新人员时,有时您必须对每个人重新编号以保持层次结构正确。如果您为此使用大间距的 ID,那么您不必经常重新编号整个事物。或者您可以使用浮点 ID 字段。
编辑:阅读其他回复后,我注意到这是嵌套集模型或其变体。