SynchTask uses a relational database (MySQL in local development), with schema currently generated via JPA/Hibernate mappings.
The current MySQL dump includes 20 tables:
activitiesboard_membershipboardschat_messageschat_room_participantschat_roomsfriendsjwt_keysnotificationsproject_membershipprojectsrefresh_tokenstask_attachmentstask_membershiptask_commentstask_labelstask_linkstasksuser_encryption_keysusers
Foreign keys enforce the most important consistency rules, including:
boards.owner_id -> users.idboards.project_id -> projects.idtasks.board_id -> boards.idtasks.owner_id -> users.idnotifications.recipient_id -> users.idrefresh_tokens.user_id -> users.idchat_messages.chat_room_id -> chat_rooms.idchat_messages.sender_id -> users.id
Join tables with composite primary keys guarantee uniqueness of memberships:
board_membership (board_id, user_id)project_membership (project_id, user_id)chat_room_participants (chat_room_id, user_id)task_membership (task_id, user_id)task_labels (task_id, label)
users.emailunique (idx_user_email)refresh_tokens.tokenuniquefriends (requester_id, friend_id)uniqueuser_encryption_keys.user_idunique
tasks.priority:LOW,MID,HIGHtasks.status:TODO,IN_PROGRESS,REVIEW,BLOCKED,COMPLETEDfriends.status:PENDING,ACCEPTED,REJECTED,BLOCKEDnotifications.type:PERSONAL,SYSTEM,TASK_UPDATE,FRIEND_REQUEST,GROUP,INVITATION,CHAT_MESSAGEusers.role:USER,COLLABORATOR,OWNER,ADMINactivities.type: board/project/task activity event types
Indexes are present for common query patterns, for example:
- timeline queries by creation date:
idx_activity_created_at,idx_board_created_at,idx_project_created_at,idx_task_created_at
- actor/recipient filters:
idx_activity_actor,idx_notification_recipient_created,idx_notification_recipient_read
- task and friendship filtering:
idx_task_status,idx_friend_status,idx_friend_requester_status,idx_friend_friend_status
- token maintenance:
idx_refresh_expiry,idx_refresh_revoked,idx_refresh_user_revoked
- Current app config still uses
ddl-auto: create-dropfor local development, which is fine for dev/test but should not be used in persistent production. - Keep the MySQL dump and ER diagram synchronized with each release candidate.
See docs/database/er-diagram.md.