This commit is contained in:
ridethepig 2022-11-09 17:29:06 +08:00
parent f92ad68d32
commit 5c7640acdc
5 changed files with 169 additions and 2 deletions

4
.gitignore vendored
View File

@ -3,4 +3,6 @@
*.o *.o
*.dtmp *.dtmp
*.tmp *.tmp
$* $*
~$*
.$*

111
sql/db_create.sql Normal file
View File

@ -0,0 +1,111 @@
drop database if exists bigwork;
create database bigwork;
create table `admin`
(
passwd varchar(100) NOT NULL
);
insert into `admin` (`passwd`) values('');
create table user
(
user_id int PRIMARY KEY AUTO_INCREMENT,
user_name varchar(100) NOT NULL,
user_mail varchar(100) NOT NULL,
user_passwd varchar(100) NOT NULL,
user_limit int NOT NULL,
user_regtime datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
create table book
(
book_id int PRIMARY KEY AUTO_INCREMENT,
book_name varchar(100) NOT NULL,
book_isbn varchar(100) DEFAULT NULL,
book_publisher varchar(100) DEFAULT NULL,
book_pubdate datetime DEFAULT NULL,
book_lang varchar(100) DEFAULT NULL,
user_id int NOT NULL,
CONSTRAINT `fk_book_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
create table document
(
doc_id int PRIMARY KEY AUTO_INCREMENT,
doc_name varchar(100) NOT NULL,
doc_url varchar(100) NOT NULL,
doc_size int NOT NULL,
doc_date datetime NOT NULL,
doc_type varchar(100) NOT NULL,
book_id int NOT NULL,
user_id int NOT NULL,
CONSTRAINT `fk_document_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`),
CONSTRAINT `fk_document_book_id` FOREIGN KEY (`book_id`) REFERENCES book(`book_id`),
INDEX (doc_name(10)),
INDEX (doc_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
create table note
(
note_id int PRIMARY KEY AUTO_INCREMENT,
note_name varchar(100) NOT NULL,
note_date datetime NOT NULL,
note_content mediumtext NOT NULL DEFAULT '',
book_id int NOT NULL,
user_id int NOT NULL,
CONSTRAINT `fk_note_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`),
CONSTRAINT `fk_note_book_id` FOREIGN KEY (`book_id`) REFERENCES book(`book_id`),
INDEX (note_name(10))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
create table record
(
record_time timestamp PRIMARY KEY,
record_type varchar(10) NOT NULL,
doc_URL varchar(100) NOT NULL,
user_id int NOT NULL,
INDEX (record_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
create table typetable
(
type_id int PRIMARY KEY AUTO_INCREMENT,
type_name varchar(20) NOT NULL,
UNIQUE (type_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
create table author
(
author_id int PRIMARY KEY AUTO_INCREMENT,
author_name varchar(50) NOT NULL,
INDEX (author_name(10))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
create table book_author
(
author_id int NOT NULL,
book_id int NOT NULL,
PRIMARY KEY (`author_id`, `book_id`),
CONSTRAINT `fk_ba_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`),
CONSTRAINT `fk_ba_author_id` FOREIGN KEY (`author_id`) REFERENCES author(`author_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
create table book_type
(
type_id int NOT NULL,
book_id int NOT NULL,
PRIMARY KEY (`type_id`, `book_id`),
CONSTRAINT `fk_bt_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`),
CONSTRAINT `fk_bt_type_id` FOREIGN KEY (`type_id`) REFERENCES typetable(`type_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
create table book_type
(
user_id int PRIMARY KEY,
user_usedspace int NOT NULL DEFAULT 0,
user_bookcount int NOT NULL DEFAULT 0,
user_doccount int NOT NULL DEFAULT 0,
user_typecount int NOT NULL DEFAULT 0,
CONSTRAINT `fk_user_stat_user` FOREIGN KEY REFERENCES user(`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

55
sql/trigger.sql Normal file
View File

@ -0,0 +1,55 @@
drop trigger if exists `trig_update_stat_book_ins`;
DELIMITER ##
create trigger `trig_update_stat_book_ins`
after insert on book
for each row begin
update user_stat set user_bookcount=user_bookcount+1 where user_stat.user_id=NEW.user_id;
end ##
DELIMITER ;
drop trigger if exists `trig_update_stat_book_del`;
DELIMITER ##
create trigger `trig_update_stat_book_del`
after delete on book
for each row begin
update user_stat set user_bookcount=user_bookcount-1 where user_stat.user_id=OLD.user_id;
end ##
DELIMITER ;
drop trigger if exists `trig_update_stat_doc_ins`;
DELIMITER ##
create trigger `trig_update_stat_doc_ins`
after insert on document
for each row begin
update user_stat set user_doccount=user_doccount+1 where user_stat.user_id=NEW.user_id;
update user_stat set user_usedspace=user_usedspace+NEW.doc_size where user_stat.user_id=NEW.user_id;
end ##
DELIMITER ;
drop trigger if exists `trig_update_stat_doc_del`;
DELIMITER ##
create trigger `trig_update_stat_doc_del`
after delete on document
for each row begin
update user_stat set user_doccount=user_doccount-1 where user_stat.user_id=OLD.user_id;
update user_stat set user_usedspace=user_usedspace-OLD.doc_size where user_stat.user_id=OLD.user_id;
end ##
DELIMITER ;
drop trigger if exists `trig_update_stat_type_ins`;
DELIMITER ##
create trigger `trig_update_stat_type_ins`
after insert on typetable
for each row begin
update user_stat set user_typecount=user_typecount+1 where user_stat.user_id=NEW.user_id;
end ##
DELIMITER ;
drop trigger if exists `trig_update_stat_type_del`;
DELIMITER ##
create trigger `trig_update_stat_type_del`
after delete on typetable
for each row begin
update user_stat set user_typecount=user_typecount-1 where user_stat.user_id=OLD.user_id;
end ##
DELIMITER ;

Binary file not shown.

View File

@ -325,7 +325,6 @@ book_author、book_type两个为全码无非主属性必然满足BCNF
触发器: 触发器:
- book_author和book_type这两个联系由数据库自动更新当插入一本图书的时候通过触发器来插入表记录同时维护author表和type表。
- 对于book表、document表、author表和type表在更改时自动更新统计信息表 - 对于book表、document表、author表和type表在更改时自动更新统计信息表
## 物理结构设计 ## 物理结构设计