【发布时间】:2009-03-24 14:49:27
【问题描述】:
我需要创建一个半复杂的存储过程。我在这里并不完全是一名 DBA,但我公司中没有其他人比我更好。基本思想是我有一组任务。用户完成这些任务并为每个完成的任务获得一个标志。要被视为“完成”,用户必须完成所有一组给定任务。关键在于,其中一些任务可能是其他任务组的包装。
例如,我们有以下可能的任务:
Task 1
Task 2
Task 3
Task 4 -> (1, 2, 3)
Task 5 -> (1, 2)
Task 6
Task 7 -> (5, 6)
一旦用户完成了任务 1 和 2,他们就隐含地完成了任务 5。一旦他们完成了任务 3,他们就隐含地完成了任务 4。
如果另一个用户完成任务 1、2 和 6,他们将隐式完成 1、2、5、6、7。
反过来,如果一项作业只需要任务 7,那么它会扩展为需要任务 6 和 5,而这需要任务 1 和 2。
我有五个基本表:userCompletedTask、assignmentRequiredTask、compoundTask、userTaskAssignment 和 task。我省略了用户和分配表,因为它是多余的。
userCompletedTask:
userID (Foreign Key on user)
taskID (Foreign Key on task)
usertTaskAssignment:
userID (Foreign key on user)
assignmentID (Foreign key on assignment)
assignmentRequiredTask:
assignmentID (Foreign key on assignment)
taskID (Foreign key on task)
task:
taskID (primary key)
compound (boolean flag. If 1, it is compound)
compoundTask:
parentID (foreign key on task)
childID (foreign key on task)
为用户分配了一个 userTaskAssignment,需要完成任务 4。我想构建一个存储过程,将根据 assignmentRequiredTasks 检查 userCompletedTasks,检查是否有适当的复合任务。
伪代码如下:
collection tasksCompleted = user->getTasksCompleted
collection tasksRequired = new collection
foreach task in assignment->getRequiredTasks
if(task.isCompound)
tasksRequired->addAll(getCompountTasks(task))
else
tasksRequired->add(task)
if tasksCompleted->containsAll(tasksRequired)
return true
else
return false
我只是不太了解 MySQL/SQL 的内部结构,无法将其转换为存储过程。最后的手段是我将代码拉入应用程序,但这确实适合数据级别。任何帮助将不胜感激。
编辑
正如下面所指出的,compoundTask 条目本身可以是复合任务。因此,您将需要一个递归练习来获得所有需要完成的非复合任务的列表。我扩展了上面的例子来说明这一点。
【问题讨论】:
标签: sql mysql stored-procedures