数据库设计问题

时间:2009-09-20 19:03:48

标签: sql mysql database-design data-modeling

我正在为酒店开发一个网站。我即将实施的其中一项工作是工人与高级的关系。在MySQL中这样做的最佳方法是什么?

这就是我的意思:一位厨师的上级是主厨,主厨的优秀是轮班经理,轮班经理的上级是总经理。在员工表中,我可以创建一个优秀员工ID的领域,但是我只能获得一个上级/上级角色;更重要的是,我无法检索经理在特定酒店管理的所有员工的名单。

希望这对于我需要建议的内容非常明确。感谢您的努力。

6 个答案:

答案 0 :(得分:1)

嗯,有了一个简单的邻接图(supervisor_id指向employees表),你当然可以做你想要的,但效率不高,不会扩展到大量的人。

您可能希望实现nested set model。这使您可以非常轻松地抓住向组织中任意人报告的每个人。

如果您在开发过程中处于早期阶段,可以考虑查看Doctrine ORM系统,该系统为模型提供嵌套行为,因此您无需实现自己的行为。

编辑:Richard Knop有一篇关于nested sets with php example code的帖子,你可能会发现它比Celko的100%-sql例子更有用..

答案 1 :(得分:0)

您可以通过在标签上执行此操作来获取经理管理的所有员工的列表:

SELECT * FROM employees WHERE `superior`='id goes here'

但是如果你或者不止一个上司只是用这样的列创建一个新表

superior, person

或者如果您想像树一样展示它,只需在查询循环中进行

答案 2 :(得分:0)

也许你最好创建一个带有角色/功能的附加表或列表,并为每个函数分配级别,所以4级将成为3级等的直接老板。

答案 3 :(得分:0)

我建议使用嵌套集模型。但是说它只允许1个人直接在他们上方拥有1名经理......

几年前我写了一篇博客。确定它在MSSQL中但它应该转换为MySQL ok。

Link here

这显示了如何插入/移动/检索完整列表等。

答案 4 :(得分:0)

如果您正在处理轮班,那么轮班经理将与轮班工作人员分开。也就是说,本周,一位厨师可能会在一位轮班经理的带领下午餐时间工作;下周,他可能会在另一位经理的指导下工作。一定要记住这些复杂性。

答案 5 :(得分:-2)

您可以使用三个字段执行此操作,即“ID”和“托管ID”范围(两个值)。这些ID不是基于任何真实的,它们只是描述层次结构。

然后,要查找所有托管员工,请在经理的“托管ID”范围内选择每个ID。最高管理者ID范围涵盖所有人,他下面的经理人覆盖较小的范围等,直到那些不管理任何人并且只有自己的范围的人。

这种设计的一个问题是,当你在人们身边洗牌或增加新人时,你有时需要对所有人重新编号以保持层次结构的正确性。如果你为此使用了很大的ID间隔,那么你不必经常重新编号。或者您可以使用浮点ID字段。

编辑:在阅读其他回复后,我注意到这是嵌套集模型或其变体。