邮件管理数据库设计--MySQL

友情链接

1、医疗信息管理系统数据库–MySQL

医疗信息管理系统数据库–MySQL

2、学生成绩管理系统数据库设计–MySQL

学生成绩管理系统数据库设计–MySQL

3、点餐系统数据库设计–SQL Server

点餐系统数据库设计–SQL Server

4、商品管理系统数据库设计–SQL Server

商品管理系统数据库设计–SQL Server

5、SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Management System Database)

SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Management System Database)

6、SQL Server电影院数据库管理系统【英文版-源码】–(Movie Theatre Management System Database)

SQL Server电影院数据库管理系统【英文版-源码】–(Movie Theatre Management System Database)

1. 项目背景及需求分析

1.1 项目背景

电子邮件在企业中被广泛的应用,员工、客户等之间沟通交流、业务往来一般都会采用电子邮件。但是由于很多企业缺乏管理电子邮件的意识,导致大量电子邮件管理混乱,并且存在一定的业务数据安全隐患。为了使企业能够高效、安全、稳定的应用电子邮件,提升公司的管理、业务、客户服务水平,提高企业内部信息沟通效率,设计一款邮件管理系统数据库,保证工作对内沟通、对外业务高效运行。

1.2 需求分析

1.2.1 信息需求

对企业而言,邮件管理是管理工作中重要的一环,但是企业的邮件工作量大、繁杂,人工处理非常困难。因此,借助于强大计算机的处理能力,能够把人从繁重的邮件管理工作中解脱出来,并且更加准确、安全、清晰的管理环境。

1.2.2 功能需求

能够进行数据库的数据定义、数据操纵、数据控制等处理功能。具体功能应包括:可提联系人信息管理、邮件信息管理,包括添加、插入、删除、更新、查询,回信邮件标识,员工及客户联系信息查询的功能。

1.2.3 安全性与完整性要求

对于邮件管理系统数据库来说,由于其主要数据是邮件和联系人信息,只能由发件人、收信人以及相关抄送人知道,因此做好数据安全性是重中之重。另外,要求所有员工的邮件信息都要录入其中,并且要设计好个别情况。

2. 概念结构设计

概念结构设计是整个数据库设计的关键,它通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型。
根据邮件信息管理数据库设计需求抽象出联系人、电子邮件、收件人集合、抄送人集合四个实体,联系人和电子邮件为强实体,收件人集合和抄送人集合为弱实体,两者依赖于联系人和电子邮件而存在。对四个实体之间的关系进行分析如下:
一个联系人会收发多封电子邮件,一封电子邮件可能会被多个人接收,所以联系人与电子邮件之间是多对多(m:n)的关系;
一个联系人可能属于多个收件人集合,一个收件人集合可能包含多个联系人,所以联系人与收件人集合是多对多(m:n)的关系;
同上,一个联系人可能属于多个抄送人集合,一个抄送人集合可能包含多个联系人,所以联系人与抄送人集合是多对多(m:n)的关系;
一封电子邮件会被一个收件人集合接收(这里收件人集合作为一个整体,一个集合可能包含多个收件人),一个收件人集合可能会接收多封电子邮件,所以电子邮件与收件人集合是多对一(n:1)的关系;
同上,一封电子邮件会被一个抄送人集合接收(这里抄送人集合作为一个整体,一个集合可能包含多个抄送人),一个抄送人集合可能会接收多封电子邮件,所以电子邮件与抄送人集合是多对一(n:1)的关系;

2.1 抽象出系统实体

联系人(用户ID、用户名、Email、电话、联系地址);
电子邮件(邮件ID、邮件标题、发件人ID、邮件发送时间,邮件内容、被回复邮件ID);
收件人集合(收件ID、邮件ID、收件人ID);
抄送人集合(抄送ID、邮件ID、收件人ID);

2.2 全局E-R图

在这里插入图片描述

3. 逻辑结构设计

3.1 关系模式

E-R图向关系模型转化要解决的问题是如何将实体型和实体间的联系转化为关系模式,如何确定这些关系模式的属性和码。
设计邮件管理数据库,包括联系人(contacts)、电子邮件(emails)、收件人集合(mail_recipients)、抄送人集合(copy_recipients)四个实体,其关系模式中对每个实体定义属性如下:
contacts 表:用户id(uid)、用户名(uname)、Email(email)、电话(cellphone)、联系地址(address),此为实体“contacts 表”所对应的关系模式,用户id为该关系的候选码,满足第三范式;
emails表:邮件id(eid)、邮件标题(title)、发件人id(uid)、邮件发送时间(create_time)、邮件内容(textbody)、被回复邮件id(reply_eid),此为实体“emails表”所对应的关系模式,邮件id为该关系的候选码,满足第三范式;
mail_recipients表:收件id(mid)、邮件id(eid)、收件人id(uid),此为实体“mail_recipients表”所对应的关系模式,收件id为该关系的候选码,满足第三范式;
copy_recipients表:抄送id(cid)、邮件id(eid)、收件人id(uid),此为实体“copy_recipients表”所对应的关系模式,抄送id为该关系的候选码,满足第三范式。

3.2 表结构

数据库中包含4个表,即联系人(contacts)、电子邮件(emails)、收件人集合(mail_recipients)、抄送人集合(copy_recipients)。

contacts表的表结构
在这里插入图片描述

emails表的表结构
在这里插入图片描述

mail_recipients表的表结构
在这里插入图片描述

copy_recipients表的表结构
在这里插入图片描述

4. 物理设计和实施

4.1 数据库及表创建

4.1.1 创建数据库

-- 如果已有该数据库,则删除
DROP DATABASE IF EXISTS EmailManagement;
-- 创建数据库
CREATE DATABASE EmailManagement CHARSET=UTF8;
-- 使用数据库
USE EmailManagement;

4.1.2 创建数据表

-- 创建数据表
-- table 1: contacts

DROP TABLE IF EXISTS contacts;
CREATE TABLE contacts(
uid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
uname VARCHAR(25),
email VARCHAR(50),
cellphone BIGINT(11),
address VARCHAR(100)
);

-- 设置CHECK 约束
ALTER TABLE contacts ADD CHECK (cellphone>0);

-- table 2: emails
DROP TABLE IF EXISTS emails;
CREATE TABLE emails(
eid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
title VARCHAR(120),
uid INT(10) UNSIGNED NOT NULL,
create_time DATETIME,
reply_id INT(10),
textbody TEXT,
FOREIGN KEY(uid) REFERENCES contacts(uid)
);

-- table 3: mail_recipients
DROP TABLE IF EXISTS mail_recipients;
CREATE TABLE mail_recipients(
mid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
eid INT(10) UNSIGNED NOT NULL,
uid INT(10) UNSIGNED NOT NULL,
FOREIGN KEY(eid) REFERENCES emails(eid),
FOREIGN KEY(uid) REFERENCES contacts(uid)
);

-- table 4: copy_recipients
DROP TABLE IF EXISTS copy_recipients;
CREATE TABLE copy_recipients(
cid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
eid INT(10) UNSIGNED NOT NULL,
uid INT(10) UNSIGNED NOT NULL,
FOREIGN KEY(eid) REFERENCES emails(eid),
FOREIGN KEY(uid) REFERENCES contacts(uid)
);

4.2 表数据插入

4.2.1 插入数据

-- 插入数据
INSERT INTO contacts VALUES
(0, "冯二", "[email protected]", 13288886666, "北京市海淀区雪花大道博信国际大厦1楼101"),
(0, "张三", "[email protected]", 13288886669, "北京市海淀区雪花大道博信国际大厦2楼201"),
(0, "李四", "[email protected]", 13288886696, "北京市海淀区雪花大道博信国际大厦3楼301"),
(0, "王五", "[email protected]", 13288886966, "北京市海淀区雪花大道博信国际大厦4楼402"),
(0, "赵六", "[email protected]", 13288889666, "北京市海淀区雪花大道博信国际大厦5楼503"),
(0, "赵七", "[email protected]", 13288896666, "北京市海淀区雪花大道博信国际大厦6楼604"),
(0, "赵八", "[email protected]", 13288986666, "北京市海淀区雪花大道博信国际大厦7楼705"),
(0, "孙十", "[email protected]", 13298886666, "北京市海淀区雪花大道博信国际大厦8楼806"),
(0, "周一", "[email protected]", 13289886666, "北京市海淀区雪花大道博信国际大厦9楼907"),
(0, "周二", "[email protected]", 13988886666, "北京市海淀区雪花大道博信国际大厦9楼908"),
(0, "周三", "[email protected]", 19288886666, "北京市海淀区雪花大道博信国际大厦9楼909");

4.2.2 测试约束

-- 测试CHECK约束
INSERT INTO contacts VALUES
(0, "周三", "[email protected]", -1528886666, "北京市海淀区雪花大道博信国际大厦9楼909");

– CHECK约束测试结果如下:
CHECK约束正常,在cellphone字段插入负数时,约束生效并报错。
在这里插入图片描述

4.2.3 插入其他表数据

INSERT INTO emails (eid, title, uid, create_time, textbody) VALUES 
(0, "防疫通知", 1, "2020-06-20 09:30:00", "根据疫情防控的最新形势,为打赢群防群控的防治阻击战,公司成立防疫工作领导小组"),
(0, "会议通知", 2, "2020-06-21 10:00:00", "通知:公司将于明天举行员工大会,XXX人员必须参加!"),
(0, "消防演习通知", 3, "2020-06-23 09:45:00", "通知:公司将于明天举行消防演习,XXX人员必须参加!"),
(0, "财务报销通知", 4, "2020-06-24 09:45:00", "通知:公司将于明天举行财务报销讲解,XXX人员必须参加!"),
(0, "规章制度通知", 5, "2020-06-25 09:45:00", "通知:公司将于明天实行新制度,XXX人员及时查看并遵守!"),
(0, "人事培训通知", 6, "2020-06-26 09:45:00", "通知:公司将于明天举行企业文化培训,XXX人员必须参加!"),
(0, "年度旅游通知", 7, "2020-06-27 09:45:00", "通知:公司将于明天举行上海一日游,XXX人员必须参加!"),
(0, "项目结题", 8, "2020-06-28 09:45:00", "通知:公司将于明天举行618项目结题会,XXX人员必须参加!");

-- 插入回复邮件信息
INSERT INTO emails (eid, title, uid, create_time, reply_id, textbody) VALUES 
(0, "项目结题回复", 9, "2020-06-29 09:45:00", 8, "收到,保证参加参加!"),
(0, "人事培训回复", 10, "2020-06-27 11:45:00", 6, "收到,保证参加参加!"),
(0, "年度旅游回复", 11, "2020-06-28 15:45:00", 7, "收到,保证参加参加!");

INSERT INTO mail_recipients VALUES
(0, 1, 2),
(0, 1, 3),
(0, 1, 4),
(0, 2, 1),
(0, 4, 3),
(0, 5, 4),
(0, 6, 5),
(0, 7, 6),
(0, 8, 7),
(0, 2, 8),
(0, 8, 9),
(0, 6, 10),
(0, 7, 11);

INSERT INTO copy_recipients VALUES
(0, 1, 5),
(0, 1, 6),
(0, 1, 7),
(0, 1, 8),
(0, 2, 1),
(0, 2, 3),
(0, 2, 4),
(0, 2, 5),
(0, 3, 6),
(0, 3, 7),
(0, 3, 8),
(0, 5, 2);

4.3 查询测试

– 1.查询联系人中姓 赵 的人有哪些,显示其所有信息

SELECT * FROM contacts WHERE uname LIKE "赵%";

查询结果:
在这里插入图片描述

– 2.查询回复过邮件的人有哪些,显示:用户编号id、姓名、和回复邮件的数量

SELECT 	 e.uid,
		 c.uname,
		 count(*) AS reply_num
FROM 	 contacts AS c INNER JOIN emails AS e ON c.uid = e.uid
WHERE	 e.reply_id IS NOT NULL
GROUP BY e.uid, c.uname;

查询结果:
在这里插入图片描述

– 3.查询抄送人数量之和达到3人及以上的邮件有哪些,要求显示:邮件id、邮件主题、邮件内容

SELECT 	 e.eid,
		 e.title,
		 e.textbody
FROM 	 emails AS e
WHERE 	 e.eid IN (SELECT eid FROM copy_recipients GROUP BY eid HAVING count(*)>=3);

结果如下:
在这里插入图片描述

– 4.查询被回复过的邮件的回复耗时,要求显示:用户姓名、邮件主题、回复耗时

SELECT 	 c.uname,
		 e1.title,
		 TIMESTAMPDIFF(HOUR, e2.create_time, e1.create_time) AS '回复耗时'
FROM 	 contacts AS c INNER JOIN emails AS e1 ON c.uid = e1.uid
			INNER JOIN emails AS e2 ON e1.reply_id = e2.eid;

结果如下:
在这里插入图片描述

– 5.查询用户收发邮件数据量,要求显示:用户ID、用户姓名、发件数量、收件数量

SELECT   e.uid,
		 c.uname,
		 count(e.uid) AS '发件数量',
		 (count(mr.uid) + count(cr.uid)) AS '收件数量'
FROM 	 contacts AS c LEFT JOIN emails AS e ON c.uid = e.uid
			LEFT JOIN mail_recipients AS mr ON e.eid = mr.eid
			LEFT JOIN copy_recipients AS cr ON e.eid = cr.eid
GROUP BY e.uid, c.uname;

结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Artificial_idiots/article/details/122094148