You are on page 1of 6

19.

7 Database structure
Here we outline Teamworks database relational structure. We assume familiarity with relational concepts. For readability and in order to give the essential information, we dont cover complete schemas. E.g. relationship to the area and operator table are usually removed.

19.7.1 Basic task data and dates


Basic task data is in the twk_task table. Notice the parent column that is a foreign key that points to the same table, and determines the task position in the tree. The recursive values of the parents are also stored (denormalized) in the ancestorids field for performance reasons.

FK_twk_task_twk_task fk_task_task

twk_task
id code name type description status relevancex progress tags progressByWorklog schedule duration standAlone logical forumEntry goals benefits externalCode costCenter pro contra notes commentOnClose startIsMilestone endIsMilestone forecasted effective customField1 customField2 customField3 customField4 customField5 customField6 lastModified lastModifier creator creationDate hidden hiddenOn hiddenBy ancestorids parent ownerx area inherit propagate options fk_tsk_sched_task fk_tsk_sched_hist fk_task_schedule

olpl_schedule
id discriminator startx endx startTime duration freq repeatx onlyWorkingDays dayOfWeek weekOfMonth

Project / task dates: the start, end and duration of the task are found by a join to the table olpl_schedule, to the filds startx, endx and duration respectively.

twk_task_sched_hist
id task changeLog schedule lastModified lastModifier creator creationDate

http://www.twproject.com - Teamwork is 2001-2010 Open Lab

Page 205 of 219

19.7.2 Task and assignments

twk_task
id code name type description status relevancex progress tags progressByWorklog schedule duration standAlone logical forumEntry goals benefits externalCode costCenter pro contra notes commentOnClose startIsMilestone endIsMilestone forecasted effective customField1 customField2 customField3 customField4 customField5 customField6 lastModified lastModifier creator creationDate hidden hiddenOn hiddenBy ancestorids

twk_assignment
id description resourcex task role estimatedwkl assignmentDate counted countingStartedAt activity induceWorklog risk enabled hourlyCost costCenter ownerx loadFromEstimation loadFromIssues externalCode lastModified lastModifier creator creationDate

twk_worklog
discriminator id creationDate creator lastModified lastModifier hidden hiddenBy hiddenOn action duration inserted

olpl_role
id discriminator name description permissionIds creationDate creator lastModifier lastModified code localToAssignment defsubscript

twk_assig_pr
id assignment cutPoint priority

twk_resource
id discriminator inherit propagate lastModified lastModifier creator creationDate hidden hiddenOn hiddenBy ancestorids

The most important relation connecting tasks with people is the assignment. The twk_assignment table is a relational table that connects tasks to resources (people) and roles. Also all worklog inserted in Teamwork is on an assignment. So to query the worklog on a task, you will have to join to assignments and from there join to worklogs.

http://www.twproject.com - Teamwork is 2001-2010 Open Lab

Page 206 of 219

19.7.3 Issues

twk_issue
id status gravity ownerx type impact descriptionx votes shouldCloseBy assignedTo task screenShot lastModified lastModifier creator creationDate lastStatusChangeDate assignedBy orderFactor screenShot2 url1 url2 notes dateSignalled estimatedDuration orderfactorbyres hidden hiddenBy hiddenOn tags areax customField1 customField2 customField3 customField4 customField5 customField6 statusx codex

twk_resource
id discriminator inherit propagate lastModified lastModifier creator creationDate hidden hiddenOn hiddenBy ancestorids parent

twk_issue_history
id creationDate

twk_task
id code name type description status relevancex progress estwklgreq schedule standAlone logical costx

creator lastModified lastModifier assignee issue statusx task olsstatus oldstatus descriptionx commentx

twk_issue_status
id askForComment askForWorklog behavesAsClosed behavesAsOpen color description orderBy

twk_worklog
id duration inserted assig issue

Issues can be without resource just on a task, or without task and then are a todo on a resource. But normally have a resource and a task, which indirectly most often determines an assignment, and that is where the worklog goes. Notice that there is a denormalized reference to worklogs, and the table issue_history where the history of changes to the issue is kept.
http://www.twproject.com - Teamwork is 2001-2010 Open Lab Page 207 of 219

19.7.4 Agenda
twk_agendaevent
id author schedule location personal type status description lastModified lastModifier creator creationDate reminder howLongBeforeStartRemind unavailability summary icalId meeting fk_ag_tar_ev fk_event_schedule

olpl_schedule
id discriminator startx endx startTime duration freq repeatx onlyWorkingDays dayOfWeek weekOfMonth
fk_res_res fk_res_boss

twk_resource
id discriminator

twk_agenda_tar
event elt
fk_agendaevent_author fk_ag_tar_res

inherit propagate lastModified lastModifier creator creationDate hidden hiddenOn hiddenBy ancestorids

fk_event_meeting

twk_event_references
event_id elt

twk_meeting
id hidden hiddenBy hiddenOn ownerx board creationDate creator lastModified lastModifier

fk_eventRef_event

FKBE914425A9C7FAEA

Every item in the agenda has a schedule and a set of participants. The schedule is directly joined, the participants are collected by joining through the twk_agenda_tar. If eventually the agenda event is also a meeting, there is a foreign key to the twk_meeting table.

http://www.twproject.com - Teamwork is 2001-2010 Open Lab

Page 208 of 219

19.7.5 Resource

twk_resource
id discriminator inherit propagate lastModified lastModifier creator creationDate hidden hiddenOn hiddenBy ancestorids parent ownerx area code location notes jobDescription staff myManager myManagerIds myCostCenter personName personSurname courtesyTitle myPhoto hiringDate personalInterest blackBoardNotes myself name

olpl_departmenttype
id stringValue description

twk_res_ad
res_id anagraphicaldata_id

olpl_anagraphicaldata
id creationDate creator lastModifier lastModified hidden hiddenOn hiddenBy locationDescription address zip telephone

olpl_location
id code name anagraphicalData

Resources are obviously involved in most Teamwork tables; here we just show the direct dependencies on this table. Notice that the resource basic data (such as e-mail) is kept in a join though twk_res_ad to olpl_anagraphicaldata.

http://www.twproject.com - Teamwork is 2001-2010 Open Lab

Page 209 of 219

19.7.6 What is the logged user?


Teamwork logged users are double entities: they are resources, so that assignments can be done on them, and users of the system ,so they can log in. So a users that logs in is a record in the olpl_operator table, that is in 1-to-1 relationship with a record in the twk_resources table.

The resource record id is shown in the web interface in the resource editor general tab;

The operator record id in the security/login tab.

In almost all cases what you need to filter records is the resource record id: on issues, worklogs, assignments.

19.7.7 Filter by area?


Filtering by area is trivial, as most objects have an area or areax column for which you can filter.

http://www.twproject.com - Teamwork is 2001-2010 Open Lab

Page 210 of 219

You might also like