This commit is contained in:
2024-03-29 16:52:46 +08:00
commit fb6ddca128
15 changed files with 1692 additions and 0 deletions

View File

@@ -0,0 +1,393 @@
<h1><center>课程作业</center></h1>
<div style="text-align: center;">
<div><span style="display: inline-block; width: 65px; text-align: center;">课程名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">数据库系统原理</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">作业次数</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">作业#1</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">学号</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">21281280</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">姓名</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">柯劲帆</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">班级</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网2101班</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">指导老师</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">郝爽</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">修改日期</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">2024年3月13日</span></div>
</div>
---
## 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、应用程序等显示它们之间的包含关系。
- 模型是一个广泛的概念,数据模型是模型的一种,特指用于数据库设计的模型。
<img src="语义网络1.drawio.svg" alt="语义网络1" style="zoom: 50%;" />
**第二组概念:**
1. **实体Entity**:现实世界中可以独立存在并可以区分的事物。
2. **实体集Entity Set**:具有相同属性的实体的集合。
3. **属性Attribute**:实体所具有的特征,如姓名、地址等。
4. **实体标识符Entity Identifier**:唯一标识实体集中每个实体的属性或属性组合。
5. **实体型Entity Type**:描述实体集的结构,即实体具有哪些属性。
6. **域Domain**:属性可以取值的集合。
7. **联系Relationship**:实体之间的关系,可以是一对一、一对多或多对多等。
**关系描述**
- 实体集由相同类型的实体构成,因此实体和实体集之间存在归属关系。
- 实体具有属性,表示实体和属性之间有拥有关系。
- 实体标识符是特定于实体集的,用于唯一标识其中的实体,显示实体标识符和实体集之间的关联关系。
- 实体型定义了实体集的结构,即包含哪些属性,因此实体型和实体集之间有定义关系。
- 域是属性可能取值的范围,因此属性和域之间存在限制关系。
- 联系描述了实体之间的关系,因此实体间存在联系关系,这可以通过实体型来描述。
<img src="./语义网络2.drawio.svg" alt="语义网络2" style="zoom: 50%;" />
## 2. 题目2
> **请从如下现实业务背景中任选一个用VISIO画出ER图表达的简化的概念模型10个实体集以内不必穷尽。**
>
> - **12306网站余票查询业务模型**
> - **航空公司航班查询业务模型**
> - **支付宝或微信支付业务模型**
> - **银行账户与转账业务模型**
> - **微信朋友圈业务模型**
> - **微信用户及聊天群聊天业务模型**
> - **短视频平台业务模型**
> - **知乎等论坛业务模型**
> - **互联网点餐业务模型**
> - **快餐店点餐业务模型(门店或网络点餐)**
>
> **注:因本学期所有的实验以及课程设计均围绕上述业务背景之一开展,建议尽早选定一个业务模型,尽早理解与分析业务,圈定你将实现的系统的功能范围(不建议范围过大)。**
<img src="ER图.drawio.svg" alt="ER图" style="zoom:67%;" />
## 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
```
查看表内容:
![查看表](查看表.png)
继续添加记录:
```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
```
查看表内容:
![查看表2](查看表2.png)
其中`AUTHOR`属性默认为`NULL`
删除记录:
```mysql
mysql> DELETE FROM BOOK
-> WHERE PUBLISHER = '机械工业出版社';
Query OK, 2 rows affected (0.45 sec)
```
查看表内容:
![查看表3](查看表3.png)
可见成功删除了两条`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)
```