C++课程设计:数据库设计

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