User存储登录用户的信息,包括账号名,密码的hash。每个User对应多个Project。一个Project对应多个Record。每条Record都是start_time,end_time,duration三个参数。
每个Project不仅存储多条Record,而且还缓存了day/week/month/year/all的时长数据。例如,存有2023年和2022年所有数据,2023-08所有数据,2023-35W所有数据,2023-08-29所有数据,这个Project累计所有数据。每个数据都是一个HH:MM:SS的时长信息。
当一个record被记录完毕,其duration将被自动记录。例如2023-08-29 16:15:00,2023-08-29 16:30:07,0:15:07作为一个record被创建后存储在Record数据库中。同时这个record对应的project中,year存有的2023,,month存有的2023-08,week存有的2023-35W,day存有的2023-08-29,all存有的total_time五个数据全部更新参数,在原有时长的基础上+0:15:07
根据以上描述,重新设计数据库及其相关的代码
数据库使用SQLite,文件schema.sql
中的内容如下:
--schema.sql
-- 创建 users 表
CREATE TABLE IF NOT EXISTS User (
id INTEGER PRIMARY KEY,
username VARCHAR(64) NOT NULL UNIQUE,
password_hash VARCHAR(128) NOT NULL
);
-- 创建 projects 表
CREATE TABLE IF NOT EXISTS Project (
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL,
name TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'In Planning', // 项目状态 InPlanning, InProgress, Completed, Abandoned, Paused
--all_time TIME DEFAULT '00:00:00',
all_time TEXT,
daily_time JSON, -- 日时间,TEXT类型存储JSON
weekly_time JSON,
monthly_time JSON,
yearly_time JSON,
--active BOOLEAN NOT NULL DEFAULT FALSE,
FOREIGN KEY (user_id) REFERENCES User (id)
);
-- 创建 records 表
CREATE TABLE IF NOT EXISTS Record (
id INTEGER PRIMARY KEY,
project_id INTEGER NOT NULL,
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP NOT NULL,
duration INTERVAL NOT NULL,
FOREIGN KEY (project_id) REFERENCES Project (id)
);
user
表示用户数据,每个用户在登录后仅可以查看自己的数据。由id
,username
,password
构成
PickleType
BLOB