课程作业
课程名称:数据库系统原理
作业次数:作业#1
学号:21281280
姓名:柯劲帆
班级:物联网2101班
指导老师:郝爽
修改日期:2024年3月13日
---
## 1. 题目1
> **语义网络是用于描述概念间关系的一种工具,请准确掌握如下两组基本概念,并用VISIO画出能准确表达这些概念之间关系的语义网络。**
> 1. **数据、数据库、数据模型、数据库管理系统、软件、模型、数据库系统**
> 2. **实体、实体集、属性、实体标识符、实体型、域、联系**
**第一组概念:**
1. **数据(Data)**:信息的最基本单元,可以是数字、文字或者任何其他形式的记录。
2. **数据库(Database)**:系统地组织、存储和管理数据的集合,以便可以高效地访问和更新。
3. **数据模型(Data Model)**:描述数据、数据关系、数据语义和数据约束的抽象模型,用于设计数据库的结构。
4. **数据库管理系统(Database Management System, DBMS)**:软件系统,用于创建、维护和操作数据库,提供数据的存储、查询和更新功能。
5. **软件(Software)**:计算机程序和相关的文档和数据的集合。
6. **模型(Model)**:现实世界事物的抽象和表示,可以是数据模型、数学模型等。
7. **数据库系统(Database System)**:包括数据库、数据库管理系统(DBMS)、应用程序和数据库管理员的总称,整体用于数据的管理和访问。
**关系描述**:
- 数据模型用于设计数据库,因此数据模型和数据库之间存在设计关系。
- 数据库被数据库管理系统管理,表明数据库和DBMS之间有管理关系。
- 数据库管理系统是一种软件,因此DBMS是软件的一个子类。
- 数据库系统是一个更广泛的概念,包括数据库、DBMS、应用程序等,显示它们之间的包含关系。
- 模型是一个广泛的概念,数据模型是模型的一种,特指用于数据库设计的模型。
**第二组概念:**
1. **实体(Entity)**:现实世界中可以独立存在并可以区分的事物。
2. **实体集(Entity Set)**:具有相同属性的实体的集合。
3. **属性(Attribute)**:实体所具有的特征,如姓名、地址等。
4. **实体标识符(Entity Identifier)**:唯一标识实体集中每个实体的属性或属性组合。
5. **实体型(Entity Type)**:描述实体集的结构,即实体具有哪些属性。
6. **域(Domain)**:属性可以取值的集合。
7. **联系(Relationship)**:实体之间的关系,可以是一对一、一对多或多对多等。
**关系描述**:
- 实体集由相同类型的实体构成,因此实体和实体集之间存在归属关系。
- 实体具有属性,表示实体和属性之间有拥有关系。
- 实体标识符是特定于实体集的,用于唯一标识其中的实体,显示实体标识符和实体集之间的关联关系。
- 实体型定义了实体集的结构,即包含哪些属性,因此实体型和实体集之间有定义关系。
- 域是属性可能取值的范围,因此属性和域之间存在限制关系。
- 联系描述了实体之间的关系,因此实体间存在联系关系,这可以通过实体型来描述。
## 2. 题目2
> **请从如下现实业务背景中任选一个,用VISIO画出ER图表达的简化的概念模型(10个实体集以内,不必穷尽)。**
>
> - **12306网站余票查询业务模型**
> - **航空公司航班查询业务模型**
> - **支付宝或微信支付业务模型**
> - **银行账户与转账业务模型**
> - **微信朋友圈业务模型**
> - **微信用户及聊天群聊天业务模型**
> - **短视频平台业务模型**
> - **知乎等论坛业务模型**
> - **互联网点餐业务模型**
> - **快餐店点餐业务模型(门店或网络点餐)**
>
> **注:因本学期所有的实验以及课程设计均围绕上述业务背景之一开展,建议尽早选定一个业务模型,尽早理解与分析业务,圈定你将实现的系统的功能范围(不建议范围过大)。**
## 3. 题目3
> **关系模型设计时经常会涉及完整性约束,数据模型中的完整性约束来源于业务背景中完整性约束要求。请观察并分析第2题中你选定的业务场景,举出至少3个以上的完整性约束例子。**
1. **实体完整性约束**:确保每个表的主键是唯一的,不允许有重复值,也不允许有空值。
- 例如,在乘客表中,身份证号可以作为主键,因为每个乘客的身份证号是唯一的。
- 列车表中,列车号可以作为主键,因为每个列车号是唯一标识一列列车的。
2. **参照完整性约束**:确保表之间的外键关系有效,即外键字段的值必须在关联表的主键字段中存在或者是空值。
- 在列车车票表中,列车号需要与列车表中的列车号相对应,这保证了列车车票的列车号在列车表中有一个有效的引用。
- 同样,列车车票表中的车站名需要与车站表中的车站名相对应,确保了车站名的有效性。
3. **域完整性约束**:指定属性值的类型、格式、范围或其他属性,确保数据符合特定条件。
- 例如,手机号在乘客表中应该遵循特定的格式,并且只能包含数字。
- 性别字段可能只允许特定的值,如"男"、"女"。
- 价格字段在列车车票表中应该是非负的。
4. **唯一性约束**:确保某一列或几列组合的值在整个表中是唯一的,避免重复记录。
- 身份证号在乘客表中不仅是主键,也需要是唯一的,以确保每个记录代表不同的乘客。
5. **用户定义的完整性约束**:确保列中的数据满足特定条件。
- 例如,始发时间必须早于到达时间,在列车表和列车车票表中都应该遵守这一规则。
## 4. 题目4
> **请自己寻找安装包,寻找安装和卸载向导,自学建库、卸载及建表方法,完成如下任务:**
>
> 1. **在自己的电脑上安装好某一版本的MySQL、SQL Server或Oracle,卸载数据库,反复若干次,确保熟练掌握这个过程。**
>
> 2. **建立一个数据库,随意建立一些数据表,比如通讯录,往表中手动增加一些信息。**
>
> **通过适当的截图界面,证明你已经熟练掌握以上技术。**
- 操作系统:Ubuntu 22.04 LTS (6.5.0-25-generic)
### 4.1. 安装MySQL
使用apt安装MySQL:
```sh
$ sudo apt update
$ sudo apt install mysql-server
```
这时MySQL服务默认已被安装进程开启。开启MySQL服务的命令为:
```sh
$ sudo systemctl start mysql.service
```
进入MySQL修改登录密码(可省略):
```sh
$ sudo mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 8.0.36-0ubuntu0.22.04.1 (Ubuntu)
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```
```mysql
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye
```
使用`mysql_secure_installation`进行配置
```sh
$ sudo mysql_secure_installation
```
配置过程略。
卸载MySQL:
```sh
$ sudo apt-get remove mysql-common
$ sudo apt-get autoremove --purge mysql-server-8.0
```
查看残留包,逐个卸载。
```sh
$ dpkg --list | grep mysql
```
清除残留数据:
```sh
$ dpkg -l | grep ^rc | awk '{print $2}' | sudo xargs dpkg -P
```
### 4.2. 操作数据库
登录MySQL:
```sh
$ sudo mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 24
Server version: 8.0.36-0ubuntu0.22.04.1 (Ubuntu)
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
```
查看已有数据库:
```mysql
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
```
创建新数据库:
```mysql
mysql> CREATE DATABASE MyDB;
Query OK, 1 row affected (0.02 sec)
```
修改数据库字符集,以便支持中文:
```mysql
mysql> ALTER DATABASE MyDB CHARACTER SET utf8;
Query OK, 1 row affected, 1 warning (0.04 sec)
```
查看及切换数据库:
```mysql
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| MyDB |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> USE MyDB;
Database changed
mysql> SHOW TABLES;
Empty set (0.00 sec)
```
创建表:
```mysql
mysql> CREATE TABLE BOOK (
-> ISBN CHAR(30) PRIMARY KEY,
-> NAME VARCHAR(30) NOT NULL,
-> AUTHOR VARCHAR(30),
-> PUBLISHER VARCHAR(30),
-> PRICE FLOAT(2)
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> SHOW TABLES;
+----------------+
| Tables_in_MyDB |
+----------------+
| BOOK |
+----------------+
1 row in set (0.00 sec)
mysql> DESC BOOK;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| ISBN | char(30) | NO | PRI | NULL | |
| NAME | varchar(30) | NO | | NULL | |
| AUTHOR | varchar(30) | YES | | NULL | |
| PUBLISHER | varchar(30) | YES | | NULL | |
| PRICE | float | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
```
添加一列:
```sh
mysql> ALTER TABLE BOOK
-> ADD COLUMN PUBLISH_YEAR YEAR;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC BOOK;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| ISBN | char(30) | NO | PRI | NULL | |
| NAME | varchar(30) | NO | | NULL | |
| AUTHOR | varchar(30) | YES | | NULL | |
| PUBLISHER | varchar(30) | YES | | NULL | |
| PRICE | float | YES | | NULL | |
| PUBLISH_YEAR | year | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM BOOK;
Empty set (0.00 sec)
```
添加完整性约束:
```mysql
mysql> ALTER TABLE BOOK
-> ADD CONSTRAINT price_positive CHECK (PRICE > 0);
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0
```
添加记录:
```mysql
mysql> INSERT INTO BOOK (ISBN, NAME, AUTHOR, PUBLISHER, PRICE, PUBLISH_YEAR)
-> VALUES ('978-7-302-42328-7', '机器学习', '周志华', '清华大学出版社', 108.00, '2016'),
-> ('978-7-111-68181-6', '数据库系统概念', 'Silberschatz et al.', '机械工业出版社', 149.00, '2021');
Query OK, 2 rows affected (0.26 sec)
Records: 2 Duplicates: 0 Warnings: 0
```
查看表内容:

继续添加记录:
```mysql
mysql> INSERT INTO BOOK (ISBN, NAME, PUBLISHER, PRICE, PUBLISH_YEAR)
-> VALUES ('978-7-111-59971-5', '计算机网络:自顶向下方法', '机械工业出版社', 89.00, '2018'),
-> ('978-7-121-43307-8', '数字图像处理学', '电子工业出版社', 199.80, '2022');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
```
查看表内容:

其中`AUTHOR`属性默认为`NULL`。
删除记录:
```mysql
mysql> DELETE FROM BOOK
-> WHERE PUBLISHER = '机械工业出版社';
Query OK, 2 rows affected (0.45 sec)
```
查看表内容:

可见成功删除了两条`PUBLISHER = '机械工业出版社'`的记录。
删除表:
```mysql
mysql> DROP TABLE BOOK;
Query OK, 0 rows affected (0.37 sec)
mysql> SHOW TABLES;
Empty set (0.00 sec)
```
删库~~跑路~~:
```mysql
mysql> DROP DATABASE MyDB;
Query OK, 0 rows affected (0.03 sec)
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| NULL |
+------------+
1 row in set (0.00 sec)
```