设计派工管理系统时建立数据库表结构遇到的一个问题?

tjyihui 2004-12-29 09:45:42
本人最近在做一个项目,给一个系统集成商设计一个简单的派工管理系统,要求记录每天的出工情况以及对每个维修人员的出工情况进行统计查询。在设计数据库时遇到一个问题,假设这里有3个数据库表:
员工信息数据库表:staff
StaffID StaffName
1 张三
2 李四
3 王五

客户资料数据库表:client
ClientID ClientName
1 天一公司
2 嘉瑞公司
3 天昌旅行社

维修记录数据库表:record
RecordID Time StaffID ClientID assignment
1 2004-12-12 1,2 1 网络维护
2 2004-12-13 3 2 上门配置交换机
3 2004-12-14 1,3 3 协助杀毒

注意:维修记录数据库表记录了公司每天的派工记录,比如第一条记录:
1 2004-12-12 1,2 1 网络维护
含义为2004-12-12,张三和李四去天一公司进行网络维护

我的问题是因为每次派出去维修的员工不一定只有一人,可能有多人。所有如果我想统计每个员工的出工情况,就会很麻烦,必须要用正则表达式分割StaffID字段,提取出员工的StaffID,然后在进行分类统计。后来我想到了一个解决方法,就是在维修记录数据库表中取消StaffID字段,然后再建立一个关联数据库表relating,让RecordID和StaffID做一对多的关联,那么对应上面record数据表中的3条数据,新的数据库表relating的内容如下:
RecordID StaffID
1 1
1 2
2 3
3 1
3 3
日后在统计每个员工的出工情况时,只需将数据库表record和relating做关联查询,就可以很简单的对每个员工的工作情况进行统计。但是我觉得这样做还是比较繁琐,比如日后如果想进行删除工作,那么就要对多表进行关联删除,比较麻烦。请问对于我遇到的这个问题,大家有什么好的解决办法吗?
...全文
136 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tjyihui 2005-01-03
  • 打赏
  • 举报
回复
突然想到一个问题想请教大家,采用xuzuning(唠叨) 推荐的第二种方法时
如果我的员工信息数据库表:staff存在超过10个员工,如
StaffID StaffName
1 张三
2 李四
3 王五
……
11 无名

那么,如果我想查询ID为1的张三的工作记录时
执行
select * from staff,record where find_in_set(1,record.StaffID);
那么结果也会把 无名 的工作记录查询出来
因为find_in_set(1,record.StaffID)会把所有包含字符串为1(包括11)的记录查询出来,这该怎么办呀?

我想到一个笨方法:
维修记录数据库表record的StaffID字段采用这种格式进行存储:1|2|11|
以后如果单独查询一个人的记录就执行find_in_set(1|,record.StaffID)
呵呵,不过感觉这种方法好像不太正规呀!
tjyihui 2005-01-03
  • 打赏
  • 举报
回复
to xuzuning(唠叨)
谢谢你的回复,我的解决方案确实不利于维护,仅仅在做复杂查询的时候就遇到了许多的问题。看来我是把问题搞复杂了,个人觉得您提出的第二种方案(查询时使用find_in_set函数)比较适合我的需求,我正在改我的代码,如有不明白的地方,还要再向大家讨教。
nationzhou 2004-12-30
  • 打赏
  • 举报
回复
又学到东西了!
xuzuning 2004-12-30
  • 打赏
  • 举报
回复
楼主的解决方案有些烦琐,且不易维护。推荐的方案有二
1、如 leyan728(乐言) 所说分开用多条记录保存
2、维持原方案,查询时用find_in_set函数,如
select * from staff,record where find_in_set(staff.StaffID,record.StaffID);
将得到
StaffID StaffName RecordID Time StaffID ClientID assignment
1 张三 1 2004-12-12 1,2 1 网络维护
2 李四 1 2004-12-12 1,2 1 网络维护
3 王五 2 2004-12-13 3 2 上门配置交换机
1 张三 3 2004-12-14 1,3 3 协助杀毒
3 王五 3 2004-12-14 1,3 3 协助杀毒

附以其他手段即可方便的满足你的要求
huabingl 2004-12-29
  • 打赏
  • 举报
回复
楼主的解决方按很好啊,我觉得这样设计十分标准。至于关联问题,只要在删除的时候多一个语句不就行了吗。
哎,都是因为mysql没有主外键。。。。。
leyan728 2004-12-29
  • 打赏
  • 举报
回复
你为什么就不能
RecordID Time StaffID ClientID assignment
1 2004-12-12 1 1 网络维护
1 2004-12-12 2 1 网络维护
这样来提交你的数据库呢?何必搞得如此麻烦?也许我板你的问题想简单了!也许是你自己想复杂了!

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧