这篇博客是我学习SQL server第四个练习,主要是研究如何设计数据库,找出实体间的联系,并建立E-R图(实体联系模型的图形化)。这个数据库设计是以我之前团队的一个项目(校社联社团管理系统)的数据库来的,该项目主要功能是协助学校校社联管理社团,主要功能有最新公告,社团信息,消息发布,注册审核,年度注册。
练习要求
选择一个主题进行设计,完成以下内容:
1、设计概念模型
(1)要求概念模型使用ER图表示,绘制各局部ER图,标注联系类型和联系属性。
(2)集成总ER图,在总ER图中各个实体不用绘制属性。
2、设计关系模型
(1)将上面ER图转换为关系,并进标识主键。
(2)确定转换后的关系所达到的最高范式。
3、设计数据库的物理模型
(1)为每一个关系设计数据表结构,至少设计一个自定义完整性约束和索引。
(2)对每一个索引,说明设计依据或功能。
(3)这部分内容,可以使用文字及表格描述,也可以直接使用SQL语句描述。
注:可以使用Power Designer软件完成
练习过程及结果
1、概念模型
2、关系模型
普通成员或社员(自增id,真实姓名,账号昵称,性别,生日,个人介绍,宿舍地址,系部,系专业,入学年份,学号,个人头像,普通用户状态)
组织成员(自增id,组织种类,组织名称,成立时间,组织介绍,社长姓名,组织logo,组织展示图,组织联系邮箱,组织联系电话,喜爱人数,组织人数,组织权限,组织用户状态)
社团年度审核(自增id,提交组织id,文件名称,审核结果状态,审核时间,审核意见,提交时间,提交人描述)
消息(自增id,消息标题,消息内容,发布时间,发送者名称,发布人id,消息类型,消息附件,消息状态)
消息接收映射(自增id,消息id,接收人id,消息状态,阅读状态)
用户组织映射(自增id,组织用户id,用户id,个人职务,所处状态,加入时间,离开时间,社团部门,状态)
注册社团审核(自增id,注册社团id,审核标题,申请姓名,注册时间,审核时间,审核结果,审核文件,审核意见,有效状态)
用户喜爱组织映射(自增id,用户id,喜爱组织id,状态)
3、数据库的物理模型
SQL代码
-- 每个表中都有一个自增的主键列,用来与其他表进行交互,该列包含了索引,此外每个表中也有了自定义完整性约束,主要是不为空约束。
USE [master]
GO
/****** Object: Database [sauims] Script Date: 2018/5/30 23:33:45 ******/
CREATE DATABASE [sauims]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'sauims', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\sauims.mdf' , SIZE = 4160KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'sauims_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\sauims_log.ldf' , SIZE = 1040KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [sauims] SET COMPATIBILITY_LEVEL = 110
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [sauims].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [sauims] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [sauims] SET ANSI_NULLS OFF
GO
ALTER DATABASE [sauims] SET ANSI_PADDING OFF
GO
ALTER DATABASE [sauims] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [sauims] SET ARITHABORT OFF
GO
ALTER DATABASE [sauims] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [sauims] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [sauims] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [sauims] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [sauims] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [sauims] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [sauims] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [sauims] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [sauims] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [sauims] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [sauims] SET ENABLE_BROKER
GO
ALTER DATABASE [sauims] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [sauims] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [sauims] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [sauims] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [sauims] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [sauims] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [sauims] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [sauims] SET RECOVERY FULL
GO
ALTER DATABASE [sauims] SET MULTI_USER
GO
ALTER DATABASE [sauims] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [sauims] SET DB_CHAINING OFF
GO
ALTER DATABASE [sauims] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO
ALTER DATABASE [sauims] SET TARGET_RECOVERY_TIME = 0 SECONDS
GO
EXEC sys.sp_db_vardecimal_storage_format N'sauims', N'ON'
GO
USE [sauims]
GO
/****** Object: Table [dbo].[anniversary_audit] Script Date: 2018/5/30 23:33:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[anniversary_audit](
[id] [int] IDENTITY(-1,-1) NOT NULL,
[org_id] [int] NOT NULL,
[audit_title] [varchar](50) NOT NULL,
[file_name] [varchar](50) NOT NULL,
[audit_state] [int] NOT NULL,
[audit_result] [varchar](100) NOT NULL,
[submit_time] [datetime2](0) NOT NULL,
[submit_description] [varchar](200) NULL,
[audit_time] [datetime2](0) NULL,
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[club_audit] Script Date: 2018/5/30 23:33:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[club_audit](
[id] [int] IDENTITY(-1,-1) NOT NULL,
[org_id] [int] NOT NULL,
[register_time] [datetime2](0) NOT NULL,
[audit_time] [datetime2](0) NULL,
[audit_result] [varchar](100) NULL,
[file] [varchar](50) NOT NULL,
[audit_description] [varchar](100) NOT NULL,
[audit_title] [varchar](100) NOT NULL,
[apply_name] [varchar](50) NOT NULL,
[audit_state] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[like_org] Script Date: 2018/5/30 23:33:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[like_org](
[id] [int] IDENTITY(-1,-1) NOT NULL,
[person_id] [int] NOT NULL,
[org_id] [int] NOT NULL,
[available] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[member] Script Date: 2018/5/30 23:33:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[member](
[id] [int] IDENTITY(-1,-1) NOT NULL,
[org_id] [int] NOT NULL,
[person_id] [int] NOT NULL,
[member_duty] [int] NOT NULL,
[member_state] [int] NOT NULL,
[join_time] [datetime2](0) NOT NULL,
[leave_time] [datetime2](0) NULL,
[org_department] [varchar](100) NULL,
[available] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[message] Script Date: 2018/5/30 23:33:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[message](
[message_id] [int] IDENTITY(-1,-1) NOT NULL,
[message_title] [varchar](100) NOT NULL,
[message_content] [varchar](300) NOT NULL,
[release_time] [datetime2](0) NOT NULL,
[org_id] [int] NOT NULL,
[message_type] [int] NOT NULL,
[message_annex] [varchar](50) NULL,
[message_state] [int] NOT NULL,
[release_name] [varchar](50) NOT NULL,
PRIMARY KEY CLUSTERED
(
[message_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[message_receive] Script Date: 2018/5/30 23:33:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[message_receive](
[id] [int] IDENTITY(-1,-1) NOT NULL,
[message_id] [int] NOT NULL,
[receive_id] [int] NOT NULL,
[read_flag] [int] NOT NULL,
[available] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[org_info] Script Date: 2018/5/30 23:33:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[org_info](
[org_id] [int] IDENTITY(-1,-1) NOT NULL,
[user_id] [int] NOT NULL,
[org_name] [varchar](40) NOT NULL,
[found_time] [datetime2](0) NOT NULL,
[description] [varchar](400) NULL,
[org_type] [varchar](50) NULL,
[admin_name] [varchar](20) NOT NULL,
[org_logo] [varchar](50) NOT NULL,
[org_view] [varchar](50) NOT NULL,
[like_click] [int] NOT NULL,
[members] [int] NOT NULL,
[contact_email] [varchar](50) NULL,
[contact_number] [varchar](13) NULL,
[org_state] [int] NOT NULL,
[org_auth] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[org_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[person_info] Script Date: 2018/5/30 23:33:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[person_info](
[person_id] [int] IDENTITY(-1,-1) NOT NULL,
[user_id] [int] NOT NULL,
[real_name] [varchar](20) NULL,
[nickname] [varchar](20) NOT NULL,
[gender] [int] NOT NULL,
[birthday] [datetime2](0) NOT NULL,
[description] [varchar](100) NULL,
[enrollment_year] [int] NULL,
[address] [varchar](40) NULL,
[department] [varchar](50) NULL,
[major] [varchar](50) NULL,
[student_id] [varchar](50) NULL,
[person_logo] [varchar](50) NOT NULL,
[person_state] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[person_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[user] Script Date: 2018/5/30 23:33:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[user](
[user_id] [int] IDENTITY(-1,-1) NOT NULL,
[user_name] [varchar](50) NOT NULL,
[password] [varchar](40) NOT NULL,
[phone] [varchar](13) NOT NULL,
[email] [varchar](50) NOT NULL,
[user_key] [varchar](40) NOT NULL,
[login_ip] [varchar](40) NOT NULL,
[login_time] [datetime2](0) NOT NULL,
[register_ip] [varchar](40) NOT NULL,
[register_time] [datetime2](0) NOT NULL,
[authority] [int] NOT NULL,
[user_state] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[user_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
SET ANSI_PADDING ON
GO
/****** Object: Index [club_name_UNIQUE] Script Date: 2018/5/30 23:33:46 ******/
CREATE UNIQUE NONCLUSTERED INDEX [club_name_UNIQUE] ON [dbo].[org_info]
(
[org_name] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
/****** Object: Index [email_UNIQUE] Script Date: 2018/5/30 23:33:46 ******/
CREATE UNIQUE NONCLUSTERED INDEX [email_UNIQUE] ON [dbo].[user]
(
[email] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
/****** Object: Index [user_name_UNIQUE] Script Date: 2018/5/30 23:33:46 ******/
CREATE UNIQUE NONCLUSTERED INDEX [user_name_UNIQUE] ON [dbo].[user]
(
[user_name] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER TABLE [dbo].[anniversary_audit] ADD DEFAULT ((2)) FOR [audit_state]
GO
ALTER TABLE [dbo].[anniversary_audit] ADD DEFAULT ('无') FOR [audit_result]
GO
ALTER TABLE [dbo].[anniversary_audit] ADD DEFAULT (NULL) FOR [submit_description]
GO
ALTER TABLE [dbo].[anniversary_audit] ADD DEFAULT (NULL) FOR [audit_time]
GO
ALTER TABLE [dbo].[club_audit] ADD DEFAULT (NULL) FOR [audit_time]
GO
ALTER TABLE [dbo].[club_audit] ADD DEFAULT (NULL) FOR [audit_result]
GO
ALTER TABLE [dbo].[club_audit] ADD DEFAULT ('无') FOR [audit_description]
GO
ALTER TABLE [dbo].[like_org] ADD DEFAULT ((0)) FOR [available]
GO
ALTER TABLE [dbo].[member] ADD DEFAULT ((0)) FOR [member_duty]
GO
ALTER TABLE [dbo].[member] ADD DEFAULT ((1)) FOR [member_state]
GO
ALTER TABLE [dbo].[member] ADD DEFAULT (NULL) FOR [leave_time]
GO
ALTER TABLE [dbo].[member] ADD DEFAULT (NULL) FOR [org_department]
GO
ALTER TABLE [dbo].[member] ADD DEFAULT ((2)) FOR [available]
GO
ALTER TABLE [dbo].[message] ADD DEFAULT (NULL) FOR [message_annex]
GO
ALTER TABLE [dbo].[message] ADD DEFAULT ((1)) FOR [message_state]
GO
ALTER TABLE [dbo].[message_receive] ADD DEFAULT ((0)) FOR [read_flag]
GO
ALTER TABLE [dbo].[message_receive] ADD DEFAULT ((1)) FOR [available]
GO
ALTER TABLE [dbo].[org_info] ADD DEFAULT (NULL) FOR [description]
GO
ALTER TABLE [dbo].[org_info] ADD DEFAULT (NULL) FOR [org_type]
GO
ALTER TABLE [dbo].[org_info] ADD DEFAULT ((0)) FOR [like_click]
GO
ALTER TABLE [dbo].[org_info] ADD DEFAULT ((0)) FOR [members]
GO
ALTER TABLE [dbo].[org_info] ADD DEFAULT (NULL) FOR [contact_email]
GO
ALTER TABLE [dbo].[org_info] ADD DEFAULT (NULL) FOR [contact_number]
GO
ALTER TABLE [dbo].[person_info] ADD DEFAULT (NULL) FOR [real_name]
GO
ALTER TABLE [dbo].[person_info] ADD DEFAULT (NULL) FOR [description]
GO
ALTER TABLE [dbo].[person_info] ADD DEFAULT (NULL) FOR [enrollment_year]
GO
ALTER TABLE [dbo].[person_info] ADD DEFAULT (NULL) FOR [address]
GO
ALTER TABLE [dbo].[person_info] ADD DEFAULT (NULL) FOR [department]
GO
ALTER TABLE [dbo].[person_info] ADD DEFAULT (NULL) FOR [major]
GO
ALTER TABLE [dbo].[person_info] ADD DEFAULT (NULL) FOR [student_id]
GO
USE [master]
GO
ALTER DATABASE [sauims] SET READ_WRITE
GO
总结
经过了这次练习,我了解数据库设计的阶段划分和每个阶段的主要工作;掌握了概念设计的意义、原则和方法;熟练掌握E-R模型设计的方法和原则,以及从E-R模型转换为关系模型的方法。
数据库设计主要分为系统需求分析阶段,概念结构设计阶段,逻辑结构设计阶段,物理结构设计阶段,数据库实施阶段,数据库运行与维护阶段。E-R图中的冲突有三种:属性冲突、命名冲突、结构冲突。
这次实验,我的确学到了很多,做这次实验之前,我还以为这次实验会很简单的,想把自己再做的一个系统的数据库,完整地根据标准流程来设计出来的。后来发现,自己的那个系统的数据库太过于复杂,要完全根据自己那个数据库设计出E-R图出来的话,涉及到太多逻辑性的东西,而且这些表之间的关系并没没有想书本写的那么简单,于是,最后自己只能根据我之前的一个系统概要地设计出数据库,忽略了很多细节方面的东西和删除了一些表,才勉强把这次实验做出来。