2009-09-20 149 views
0

我目前正在为酒店开发一个网站。而我即将实施的其中一件事就是工人与上司的关系。在MySQL中这样做的最好方法是什么?数据库设计问题

以下是我的意思:一位厨师的上司是一名主厨,主厨的上级是班主任,班主任的上司是总经理。在员工表中,我可以使用高级员工的ID作为领域优势,但是我只能获得一个高级/高级角色;更重要的是,我无法检索经理在特定酒店管理的所有员工名单。

希望这已经足够清楚我需要什么建议..谢谢你的努力。

+0

你想要一个雇员有几个老板? – elviejo79 2009-09-20 19:12:13

+0

对不起,我忘记提到一个员工最多可以有1个上司,所以像总经理一样从顶层到底层的层次结构更重要的是可以查看所有员工的数据。与能够查看所有员工的数据但不能查看其他班次经理的数据的班次经理不同。 – ant 2009-09-20 19:17:04

回答

1

好,用一个简单的邻接图(supervisor_id在emplo指回yees表),你当然可以做你想做的事情,但效率不高,并且不会扩展到大量的人。

你可能想要的是实现一个nested set model。这使您可以非常轻松地抓住每个向组织中的任意人员报告的人员。

如果您足够早进行开发,您可以考虑查看Doctrine ORM系统,该系统为模型提供了嵌套集行为,因此您不需要实现自己的行为。

编辑:理查德·克诺普有一篇关于nested sets with php example code,你可能会发现比Celko的100%-sql例子更有帮助..

+0

我喜欢你的答案,现在我要做一些阅读..并希望事情将如何他们应该是:D tnx – ant 2009-09-20 19:30:52

+0

我有问题关于这篇文章http://www.intelligententerprise.com/001020/celko.jhtml;jsessionid=CQYCHUUILHLFRQE1GHRSKH4ATMY32JVN如何插入数据到数据库中,通过插入它们手动创建PHP表单来执行它,就像计算这些一样:这有一些可预测的结果,我们可以用于构建查询。根始终是形式(left = 1,right = 2 *(SELECT COUNT(*)FROM TreeTable));叶节点总是(左+ 1 =右); BETWEEN谓词定义子树;等等。 – ant 2009-09-20 20:09:08

+0

不确定你在问什么,但希望我刚添加到我的答案的链接将有助于为你阐明事情。 – timdev 2009-09-20 20:20:50

0

你可以得到所有经理管理通过对你的标签这样的员工的列表:

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

但是,如果你或回合制出一个以上出众只是做一个新的表像这样的列

superior, person 

,或者如果你想显示它就像一棵树只是做它在查询的循环

+0

对不起,我忘记提到一个员工最多可以有1位上司,所以像总经理一样从顶层到底层的层次结构更重要的是可以查看所有员工的数据。与能够查看所有员工的数据但不能查看其他班次经理的数据的班次经理不同。 – ant 2009-09-20 19:15:56

+0

好吧,这很容易,因为那么你只是喜欢上面的第一个查询 – kennyisaheadbanger 2009-09-21 17:05:42

0

也许你会过得更好创建一个额外的表或列表与角色/功能和分配因此4级会成为3级的直接老板等。

0

我建议一个嵌套集合模型。但是,表示只允许1人直接在他们之上拥有1位经理...

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

Link here

这表明如何插入/移动/检索完整列表等

-2

你可以用三个字段,一个“ID”和“管理标识”范围(两个值)做到这一点。这些ID不是基于任何真实的,而只是描述层次结构。

然后,要查找所有管理员工,请选择经理的“受管理的ID”范围中的每个ID。高层管理人员的ID范围涵盖了所有人,其下的管理人员覆盖的范围较小,等等,这些人不管任何人,只有他们自己的范围。

这个设计的一个问题是,当你洗牌或添加新的人时,你有时必须重新编号,以保持层级。如果你为此使用了很好的ID大间隔,那么你不必经常重新编号整个事物。或者你可以使用浮点ID字段。

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

0

如果您正在处理班次,班次经理将与班次工作人员分开。也就是说,本周,一名厨师可能正在一名班次管理员的午餐时间内工作;下周,他可能会在另一位经理的晚班上工作。一定要记住这样的复杂性。