SQL server 练习4(数据库设计(E-R图))

  这篇博客是我学习SQL server第四个练习,主要是研究如何设计数据库,找出实体间的联系,并建立E-R图(实体联系模型的图形化)。这个数据库设计是以我之前团队的一个项目(校社联社团管理系统)的数据库来的,该项目主要功能是协助学校校社联管理社团,主要功能有最新公告,社团信息,消息发布,注册审核,年度注册。

练习要求

  选择一个主题进行设计,完成以下内容:
1、设计概念模型
(1)要求概念模型使用ER图表示,绘制各局部ER图,标注联系类型和联系属性。
(2)集成总ER图,在总ER图中各个实体不用绘制属性。
2、设计关系模型
(1)将上面ER图转换为关系,并进标识主键。
(2)确定转换后的关系所达到的最高范式。
3、设计数据库的物理模型
(1)为每一个关系设计数据表结构,至少设计一个自定义完整性约束和索引。
(2)对每一个索引,说明设计依据或功能。
(3)这部分内容,可以使用文字及表格描述,也可以直接使用SQL语句描述。

注:可以使用Power Designer软件完成

练习过程及结果

主题为校社联社团管理系统

1、概念模型

局部E-R图

这里写图片描述

全局E-R图

这里写图片描述
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图出来的话,涉及到太多逻辑性的东西,而且这些表之间的关系并没没有想书本写的那么简单,于是,最后自己只能根据我之前的一个系统概要地设计出数据库,忽略了很多细节方面的东西和删除了一些表,才勉强把这次实验做出来。

猜你喜欢

转载自blog.csdn.net/weixin_37610397/article/details/80873121