diff --git a/Assignments/Assignment2/source/作业2_21281280_柯劲帆.md b/Assignments/Assignment2/source/作业2_21281280_柯劲帆.md new file mode 100644 index 0000000..b806dfa --- /dev/null +++ b/Assignments/Assignment2/source/作业2_21281280_柯劲帆.md @@ -0,0 +1,140 @@ +

课程作业

+ +
+
课程名称:数据库系统原理
+
作业次数:作业#2
+
学号:21281280
+
姓名:柯劲帆
+
班级:物联网2101班
+
指导老师:郝爽
+
修改日期:2024年3月29日
+
+ + + + + +--- + +## 1. 题目1 + +> **尝试标识该业务场景中的数据模式,即列出该业务涉及到的所有实体型(包括实体名及属性,可以适当简化)。采用如下形式列出:** +> +> **实体型名1(属性1,…,属性n)** +> +> **尝试在你选定的数据库平台中建立实体型所对应的表,并想办法往其中插入数据,验证你所设计的模型的合理性。** + +该业务中涉及到的所有实体型及其属性如下: + +| 实体型名1 (属性1,…,属性n) | 含义 | +| ------------------------------------------------------------ | ---------------- | +| **Passengers** (ID, Name, Phone_number) | 乘车乘客 | +| **Users** (ID, Password, Phone_number, CitizenID) | 购票平台用户 | +| **Stations** (ID, Name, Province, City) | 车站 | +| **Trains** (ID, Property, StationID_start, StationID_arrive) | 列车车次 | +| **Seats** (ID, Type, TrainID) | 座位 | +| **Tickets** (ID, Price, Time_start, Time_arrive, StationID_start, StationID_arrive, SeatID) | 相邻两站间的车票 | +| **Transactions** (ID, Time, Paid, User, PassengerID, TrainID, StationID_start, StationID_arrive, SeatID) | 订单 | +| **Sold** (TransactionID, TicketID) | 已售出的车票 | +| **Passbys** (StationID, TrainID, arrive_time, leave_time) | 列车过站表 | + + + +## 2. 题目2 + +> 请自学了解Axure RP等快速原型设计工具的概念及功能,并尝试下载一个试用版。请你充当产品经理和产品界面模型设计工程师,模仿或创新设计两个用户界面UI,列出该用户界面对应的用户视图(用户所能操作的外模式)。请提交原始设计文档以证明你做了此项工作。 + +界面截图 + +具体见原始文档。 + + + +## 3. 题目3 + +> 请通过你所设计的用户界面所对应的外模式,以及该外模式与各种模式间的映射关系,思考并叙述数据库系统从内模式、模式、外模式并最终到用户界面的映射过程,分析过程中可能会涉及到的数据加工环节。分别指出一般需要由程序员写程序实现的环节和由数据库管理系统实现的环节。 + +数据库系统通常遵循三级模式结构,包括内模式、模式(也称为概念模式)和外模式。这种结构旨在提供数据抽象和系统独立性。映射过程从存储在数据库中的数据(内模式)到最终用户界面的展示涉及多个步骤,每个步骤都可能需要数据加工和转换。下面是从内模式到用户界面的映射过程,以及过程中的数据加工环节和谁(程序员或数据库管理系统)负责实现这些环节的概述。 + +**内模式到模式的映射** + +- **内模式**是数据库物理存储的低级表示,包括如何在存储介质(如磁盘)上存储数据(例如,记录格式、索引结构、压缩技术等)。 +- **模式**或概念模式是数据库的整体逻辑视图,描述了数据库中所有数据的结构和关系,但不涉及数据如何存储。 + +**映射**:由数据库管理系统(DBMS)自动处理。这包括如何将概念模式中定义的实体、属性和关系映射到实际存储的数据上。数据加工通常不是必需的,因为这一层主要关注数据的逻辑结构而非其表示。 + +**模式到外模式的映射** + +- **外模式**是数据库的用户视图,也称为子模式。一个数据库可以有多个外模式,每个外模式为一组用户或应用程序提供所需的数据视图。 + +**映射**:通常由DBMS自动处理,涉及将数据库的整体逻辑视图(模式)转换为特定用户或应用程序所需的视图(外模式)。这个过程可能涉及到数据的选择(仅展示部分数据)、投影(仅展示某些属性)和连接(整合多个表中的数据)操作。数据加工主要由DBMS执行的查询处理完成。 + +**外模式到用户界面的映射** + +这是将用户界面所需的数据从数据库的外模式转换成最终用户可以理解和交互的形式。这个过程可能包括: + +- **格式化**:将数据转换为用户界面要求的格式,如日期格式、货币格式等。 +- **过滤**:根据用户请求或权限过滤数据。 +- **聚合**:进行数据汇总,如计算总和、平均值等。 +- **排序**:根据特定属性对数据进行排序。 + +**映射**:这个过程一般需要由程序员通过编写应用程序代码来实现。虽然DBMS提供了从内模式到外模式的映射,但最终将数据呈现给用户,尤其是数据的加工和格式化,通常需要应用程序层面的逻辑来完成。 + +**数据加工环节** + +- **数据格式化和转换**:通常由程序员实现,以确保数据以用户友好的方式显示。 +- **数据过滤和权限控制**:可能由程序员在应用层面实现,也可能通过数据库查询(由DBMS处理)实现,依据用户的权限展示数据。 +- **数据聚合和排序**:通常在数据库查询中指定(由DBMS执行),但最终结果的展示和微调可能需要程序员的介入。 + +数据库管理系统负责从内模式到外模式的自动映射和数据处理,而将外模式数据加工成最终用户界面所需形式的任务,则通常需要程序员通过编程来完成。这种分工充分利用了DBMS的自动化处理能力,同时提供了灵活性,以适应不同用户界面的具体需求。 + + + +## 4. 题目4 + +> 请尝试学习掌握数据库系统数据规模(条或记录数)估算方法,估计所选业务场景的数据规模,针对这种规模,请说明这种规模的数据可能对内模式的实现或表示存在什么要求。 + +**数据规模估算** + +| 实体 | 数据规模 | +| ------------ | ------------------------------------------------------------ | +| Passengers | 假设每日新增乘客记录数为1,000条,年增长量为365,000条。五年后,总记录数大约为1,825,000条。 | +| Users | 如果80%的乘客注册成为用户,那么五年后,用户总数大约为1,460,000条记录。 | +| Stations | 考虑到火车站数量相对固定,假设有6,000个火车站。 | +| Trains | 约有4,000个不同的车次 | +| Seats | 假设每列火车平均有500个座位,共有2,000,000个座位 | +| Tickets | 每个座位约经过10个站,共有20,000,000张票,记录起售至发车共15天,则有300,000,000张票 | +| Transactions | 每天约600,000条记录,记录30天,共有18,000,000条 | +| Sold | 起售至发车共15天,平均满座率按60%计,12,000,000条记录 | +| Passbys | 6,000个车站预估共有100,000车次经过 | + +**数据规模对内模式的要求** + +1. 存储空间 + - **大容量存储**:随着数据规模的增长,需要大量的存储空间来存放记录,尤其是对于Tickets和Transactions这样频繁增加的实体。 + + +2. 性能优化 + + - **索引**:为了提高查询效率,对常用的查询字段(如Passenger ID, Train ID, Station ID等)建立索引是必要的。 + + - **分区**:对于大量记录的表,如Tickets和Transactions,可以采用分区技术,将数据分布在不同的物理区域,以优化查询性能和数据管理。 + + - **压缩**:对于历史数据,可以考虑数据压缩技术来节省存储空间,同时考虑对这部分数据的查询性能影响。 + + +3. 数据安全和完整性 + + - **备份和恢复**:随着数据规模的增长,需要考虑高效的备份和恢复方案,以应对数据丢失或损坏的情况。 + + - **事务管理**:对于如Transactions这样的事务性数据,需要强大的事务管理机制来确保数据的一致性和完整性。 + + +4. 扩展性和可维护性 + + - **分布式数据库**:对于极大规模的数据,可能需要考虑分布式数据库解决方案,以提供足够的存储空间和计算能力,同时优化数据的访问速度。 + + - **数据清理**:定期的数据清理和归档策略可以帮助保持数据库的性能,移除不再需要的记录或将老旧数据迁移到更便宜的存储介质上。 + + +随着数据规模的增长,内模式的设计和实现需要考虑到存储管理、性能优化、数据安全和完整性以及系统的扩展性和可维护性等多方面的要求。通过合理的数据库设计和管理策略,可以有效应对大规模数据带来的挑战。 diff --git a/Assignments/Assignment2/source/界面截图.png b/Assignments/Assignment2/source/界面截图.png new file mode 100644 index 0000000..253f0cb Binary files /dev/null and b/Assignments/Assignment2/source/界面截图.png differ diff --git a/Assignments/Assignment2/src/login.rp b/Assignments/Assignment2/src/login.rp new file mode 100644 index 0000000..059d0d2 Binary files /dev/null and b/Assignments/Assignment2/src/login.rp differ diff --git a/Assignments/Assignment2/src/search.rp b/Assignments/Assignment2/src/search.rp new file mode 100644 index 0000000..8eab05f Binary files /dev/null and b/Assignments/Assignment2/src/search.rp differ diff --git a/Assignments/Assignment2/作业2_21281280_柯劲帆.pdf b/Assignments/Assignment2/作业2_21281280_柯劲帆.pdf new file mode 100644 index 0000000..6156289 Binary files /dev/null and b/Assignments/Assignment2/作业2_21281280_柯劲帆.pdf differ diff --git a/Assignments/Assignment3/source/作业3_21281280_柯劲帆.md b/Assignments/Assignment3/source/作业3_21281280_柯劲帆.md new file mode 100644 index 0000000..1767d6a --- /dev/null +++ b/Assignments/Assignment3/source/作业3_21281280_柯劲帆.md @@ -0,0 +1,425 @@ +

课程作业

+ +
+
课程名称:数据库系统原理
+
作业次数:作业#3
+
学号:21281280
+
姓名:柯劲帆
+
班级:物联网2101班
+
指导老师:郝爽
+
修改日期:2024年3月30日
+
+--- + +# 1. 题目1 + +> **按如下格式要求在实验报告中描述所有涉及到的表的结构。** +> +> **(格式说明略)** + +**Passengers** + +| 表名 | 数据库用户 | 主键 | 外键 | 排序字段 | 索引字段 | +| ---------- | ---------- | ---- | ---- | -------- | ---------------- | +| Passengers | kejingfan | ID | | ID | ID; Phone_number | + +| 字段名称 | 数据类型 | 允许为空 | 唯一 | 默认值 | 约束条件 | +| ------------ | --------------- | -------- | ---- | ------ | ------------------------ | +| ID | BIGINT | N | Y | | 主键, 符合正则'^\d{18}$' | +| Name | VARCHAR ( 255 ) | N | N | | | +| Phone_number | BIGINT | N | Y | | 唯一, 符合正则'^\d{11}$' | + +**Users** + +| 表名 | 数据库用户 | 主键 | 外键 | 排序字段 | 索引字段 | +| ----- | ---------- | ---- | ----------------------- | -------- | --------------------------- | +| Users | kejingfan | ID | Phone_number; CitizenID | ID | ID; Phone_number; CitizenID | + +| 字段名称 | 数据类型 | 允许为空 | 唯一 | 默认值 | 约束条件 | +| ------------ | --------------- | -------- | ---- | ------ | -------- | +| ID | INT | N | Y | | 主键 | +| Password | VARCHAR ( 255 ) | N | N | | | +| Phone_number | BIGINT | N | Y | | 外键 | +| CitizenID | BIGINT | N | Y | | 外键 | + +**Stations** + +| 表名 | 数据库用户 | 主键 | 外键 | 排序字段 | 索引字段 | +| -------- | ---------- | ---- | ---- | -------- | -------- | +| Stations | kejingfan | ID | | ID | ID; Name | + +| 字段名称 | 数据类型 | 允许为空 | 唯一 | 默认值 | 约束条件 | +| -------- | --------------- | -------- | ---- | ------ | -------- | +| ID | INT | N | Y | | 主键 | +| Name | VARCHAR ( 255 ) | N | Y | | 唯一 | +| Province | VARCHAR ( 255 ) | N | N | | | +| City | VARCHAR ( 255 ) | N | N | | | + +**Trains** + +| 表名 | 数据库用户 | 主键 | 外键 | 排序字段 | 索引字段 | +| ------ | ---------- | ---- | --------------------------------- | -------- | ------------------------------------- | +| Trains | kejingfan | ID | StationID_start; StationID_arrive | ID | ID; StationID_start; StationID_arrive | + +| 字段名称 | 数据类型 | 允许为空 | 唯一 | 默认值 | 约束条件 | +| ---------------- | --------------- | -------- | ---- | ------ | -------- | +| ID | VARCHAR ( 255 ) | N | Y | | 主键 | +| Property | SMALLINT | N | N | | | +| StationID_start | INT | N | N | | 外键 | +| StationID_arrive | INT | N | N | | 外键 | + +说明: + +Property字段,值的二进制的每一位表示: + +| 位数 | 3 | 2 | 1 | 0 | +| ------------- | -------------- | ---------------- | ---------- | -------------- | +| 值为0/1的含义 | 无/有 静音车厢 | 不是/是 智能车厢 | 无/有 卧铺 | 不是/是 复兴号 | + +如$\text{Property} = {(9)}_{10} = {(1001)}_{2}$,说明有静音车厢、是复兴号。 + +**Seats** + +| 表名 | 数据库用户 | 主键 | 外键 | 排序字段 | 索引字段 | +| ----- | ---------- | ---- | ------- | -------- | ----------- | +| Seats | kejingfan | ID | TrainID | ID | ID; TrainID | + +| 字段名称 | 数据类型 | 允许为空 | 唯一 | 默认值 | 约束条件 | +| -------- | --------------- | -------- | ---- | ------ | -------- | +| ID | VARCHAR ( 255 ) | N | Y | | 主键 | +| Type | VARCHAR ( 255 ) | N | N | | | +| TrainID | VARCHAR ( 255 ) | N | N | | 外键 | + +**Tickets** + +| 表名 | 数据库用户 | 主键 | 外键 | 排序字段 | 索引字段 | +| ------- | ---------- | ---- | ----------------------------------------- | -------- | --------------------------------------------- | +| Tickets | kejingfan | ID | StationID_start; StationID_arrive; SeatID | ID | ID; StationID_start; StationID_arrive; SeatID | + +| 字段名称 | 数据类型 | 允许为空 | 唯一 | 默认值 | 约束条件 | +| ---------------- | ---------------- | -------- | ---- | ------ | -------------------------------- | +| ID | INT | N | Y | | 主键 | +| Price | DECIMAL ( 7, 2 ) | N | N | | | +| Time_start | DATETIME | N | N | | | +| Time_arrive | DATETIME | N | N | | 检查 (Time_start <= Time_arrive) | +| StationID_start | INT | N | N | | 外键 | +| StationID_arrive | INT | N | N | | 外键 | +| SeatID | VARCHAR ( 255 ) | N | N | | 外键 | + +**Transactions** + +| 表名 | 数据库用户 | 主键 | 外键 | 排序字段 | 索引字段 | +| ------------ | ---------- | ---- | ------------------------------------------------------------ | -------- | ------------------------------------------------------------ | +| Transactions | kejingfan | ID | User; PassengerID; TrainID; StationID_start; StationID_arrive; SeatID | ID | ID; User; PassengerID; TrainID; StationID_start; StationID_arrive; SeatID | + +| 字段名称 | 数据类型 | 允许为空 | 唯一 | 默认值 | 约束条件 | +| ---------------- | --------------- | -------- | ---- | ------ | ------------------------------- | +| ID | BIGINT | N | Y | | 主键 | +| Time | DATETIME | N | N | | | +| Paid | TINYINT | N | N | | | +| User | INT | N | N | | 外键 | +| PassengerID | BIGINT | N | N | | 外键 | +| TrainID | VARCHAR ( 255 ) | N | N | | 外键 | +| StationID_start | INT | N | N | | 外键 | +| StationID_arrive | INT | N | N | | 外键 | +| Time_start | DATETIME | N | N | | | +| Time_arrive | DATETIME | N | N | | 检查 (Time_start < Time_arrive) | +| SeatID | VARCHAR ( 255 ) | N | N | | 外键 | + +**Sold** + +| 表名 | 数据库用户 | 主键 | 外键 | 排序字段 | 索引字段 | +| ---- | ---------- | ---- | ----------------------- | -------- | ----------------------- | +| Sold | kejingfan | | TransactionID; TicketID | | TransactionID; TicketID | + +| 字段名称 | 数据类型 | 允许为空 | 唯一 | 默认值 | 约束条件 | +| ------------- | -------- | -------- | ---- | ------ | -------- | +| TransactionID | BIGINT | N | N | | 外键 | +| TicketID | INT | N | N | | 外键 | + +**Passbys** + +| 表名 | 数据库用户 | 主键 | 外键 | 排序字段 | 索引字段 | +| ------- | ---------- | ---- | ----------------- | -------- | -------------- | +| Passbys | kejingfan | | StationID; TrainID| | StationID; TrainID | + +| 字段名称 | 数据类型 | 允许为空 | 唯一 | 默认值 | 约束条件 | +| ----------- | --------------- | -------- | ---- | ------ | -------------------------------- | +| StationID | INT | N | N | | 外键 | +| TrainID | VARCHAR ( 255 ) | N | N | | 外键 | +| arrive_time | DATETIME | N | N | | | +| leave_time | DATETIME | N | N | | 检查 (arrive_time <= leave_time) | + + + +# 2. 题目2 + +> **根据以上定义,写出各表的建表语句,并在你选定的关系型数据库平台上建立各个表,请将建表语句统一写在扩展名为sql文件中,构建一个建库脚本文本,命名要求为:DBLabScript_学号.sql** + +```mysql +CREATE TABLE Passengers ( + ID BIGINT PRIMARY KEY, + `Name` VARCHAR ( 255 ) NOT NULL, + Phone_number BIGINT UNIQUE NOT NULL, + CHECK ( REGEXP_LIKE ( ID, '^\\d{18}$' ) ), + CHECK ( REGEXP_LIKE ( Phone_number, '^\\d{11}$' ) ) +); + +CREATE TABLE Users ( + ID INT AUTO_INCREMENT PRIMARY KEY, + `Password` VARCHAR ( 255 ) NOT NULL, + Phone_number BIGINT UNIQUE NOT NULL, + CitizenID BIGINT UNIQUE NOT NULL, + FOREIGN KEY ( Phone_number ) REFERENCES Passengers ( Phone_number ) ON DELETE CASCADE, + FOREIGN KEY ( CitizenID ) REFERENCES Passengers ( ID ) ON DELETE CASCADE +); + +CREATE TABLE Stations ( + ID INT AUTO_INCREMENT PRIMARY KEY, + `Name` VARCHAR ( 255 ) UNIQUE NOT NULL, + Province VARCHAR ( 255 ) NOT NULL, + City VARCHAR ( 255 ) NOT NULL +); + +CREATE TABLE Trains ( + ID VARCHAR ( 255 ) PRIMARY KEY, + Property SMALLINT NOT NULL, + StationID_start INT NOT NULL, + StationID_arrive INT NOT NULL, + FOREIGN KEY ( StationID_start ) REFERENCES Stations ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( StationID_arrive ) REFERENCES Stations ( ID ) ON DELETE CASCADE +); + +CREATE TABLE Seats ( + ID VARCHAR ( 255 ) PRIMARY KEY, + Type VARCHAR ( 255 ) NOT NULL, + TrainID VARCHAR ( 255 ) NOT NULL, + FOREIGN KEY ( TrainID ) REFERENCES Trains ( ID ) ON DELETE CASCADE +); + +CREATE TABLE Tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + Price DECIMAL ( 7, 2 ) NOT NULL, + Time_start DATETIME NOT NULL, + Time_arrive DATETIME NOT NULL, + StationID_start INT NOT NULL, + StationID_arrive INT NOT NULL, + SeatID VARCHAR ( 255 ) NOT NULL, + FOREIGN KEY ( StationID_start ) REFERENCES Stations ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( StationID_arrive ) REFERENCES Stations ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( SeatID ) REFERENCES Seats ( ID ) ON DELETE CASCADE, + CHECK (Time_start <= Time_arrive) +); + +CREATE TABLE Transactions ( + ID BIGINT AUTO_INCREMENT PRIMARY KEY, + `Time` DATETIME NOT NULL, + Paid TINYINT NOT NULL, + `User` INT NOT NULL, + PassengerID BIGINT NOT NULL, + TrainID VARCHAR ( 255 ) NOT NULL, + StationID_start INT NOT NULL, + StationID_arrive INT NOT NULL, + Time_start DATETIME NOT NULL, + Time_arrive DATETIME NOT NULL, + SeatID VARCHAR ( 255 ) NOT NULL, + FOREIGN KEY ( `User` ) REFERENCES Users ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( PassengerID ) REFERENCES Passengers ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( TrainID ) REFERENCES Trains ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( StationID_start ) REFERENCES Stations ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( StationID_arrive ) REFERENCES Stations ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( SeatID ) REFERENCES Seats ( ID ) ON DELETE CASCADE, + CHECK (Time_start < Time_arrive) +); + +CREATE TABLE Sold ( + TransactionID BIGINT NOT NULL, + TicketID INT NOT NULL, + FOREIGN KEY ( TransactionID ) REFERENCES Transactions ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( TicketID ) REFERENCES Tickets ( ID ) ON DELETE CASCADE +); + +CREATE TABLE Passbys ( + StationID INT NOT NULL, + TrainID VARCHAR ( 255 ) NOT NULL, + arrive_time DATETIME NOT NULL, + leave_time DATETIME NOT NULL, + FOREIGN KEY ( StationID ) REFERENCES Stations ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( TrainID ) REFERENCES Trains ( ID ) ON DELETE CASCADE, + CHECK (arrive_time <= leave_time) +); +``` + + + +# 3. 题目3 + +> **掌握使用各自选用的关系型数据库的控制台插入数据的不同方法(执行数据批量插入脚本、窗口界面表格式手工录入、命令行交互式录入),实际填入测试数据,以验证你所设计的数据模型的合理性和完整性,注意验证三种完整性约束。** + +**执行数据批量插入脚本** + +```mysql +INSERT INTO Stations ( `Name`, Province, City ) +VALUES + ( '北京南', '北京', '北京' ), + ( '沧州西', '河北', '沧州' ), + ( '济南西', '山东', '济南' ), + ( '徐州东', '江苏', '徐州' ), + ( '宿州东', '安徽', '宿州' ), + ( '蚌埠南', '安徽', '蚌埠' ), + ( '南京南', '江苏', '南京' ), + ( '无锡南', '江苏', '无锡' ), + ( '上海虹桥', '上海', '上海' ); + +INSERT INTO Trains ( ID, StationID_start, StationID_arrive, Property ) +VALUES + ( 'G103', 1, 9, 1 ); + +INSERT INTO Passbys ( StationID, TrainID, arrive_time, leave_time ) +VALUES + ( 1, 'G103', '2024-03-28 06:20:00', '2024-03-28 06:20:00' ), + ( 2, 'G103', '2024-03-28 07:13:00', '2024-03-28 07:15:00' ), + ( 3, 'G103', '2024-03-28 08:01:00', '2024-03-28 08:04:00' ), + ( 4, 'G103', '2024-03-28 09:07:00', '2024-03-28 09:09:00' ), + ( 5, 'G103', '2024-03-28 09:28:00', '2024-03-28 09:33:00' ), + ( 6, 'G103', '2024-03-28 09:56:00', '2024-03-28 09:58:00' ), + ( 7, 'G103', '2024-03-28 10:40:00', '2024-03-28 10:43:00' ), + ( 8, 'G103', '2024-03-28 11:27:00', '2024-03-28 11:29:00' ), + ( 9, 'G103', '2024-03-28 11:58:00', '2024-03-28 11:58:00' ); +``` + +**窗口界面表格式手工录入** + +使用Navicat软件进行窗口界面表格式手工录入。 + +![窗口插入](窗口插入.png) + +**命令行交互式录入** + +登录MySQL: + +```sh +$ mysql -u kejingfan -p -h 192.168.31.197 +``` + +使用数据库: + +```mysql +mysql> USE DBLab; +``` + +输入插入数据命令: + +```mysql +mysql> INSERT INTO Passbys ( StationID, TrainID, arrive_time, leave_time ) + -> VALUES ( 9, 'G137', '2024-03-30 18:56:00', '2024-03-30 18:56:00' ); +``` + +查看插入结果: + +```mysql +mysql> SELECT * FROM Passbys + -> WHERE StationID = 9; ++-----------+---------+---------------------+---------------------+ +| StationID | TrainID | arrive_time | leave_time | ++-----------+---------+---------------------+---------------------+ +| 9 | G103 | 2024-03-28 11:58:00 | 2024-03-28 11:58:00 | +| 9 | G137 | 2024-03-30 18:56:00 | 2024-03-30 18:56:00 | ++-----------+---------+---------------------+---------------------+ +2 rows in set (0.03 sec) +``` + +截图如下: + +![命令行插入](命令行插入.png) + + + +# 4. 题目4 + +> **请根据以上设计结果,重新完善与整理实验2中所设计的模式,可重新修改并提交作业2。** + +已在作业2中完善模式。 + + + +# 5. 题目5 + +> **请设计一些简单的单表查询、多表连接查询语句,查询表中的内容,并截图证明。** + +**单表查询** + +```mysql +mysql> SELECT * FROM Passbys + -> WHERE StationID = 9; ++-----------+---------+---------------------+---------------------+ +| StationID | TrainID | arrive_time | leave_time | ++-----------+---------+---------------------+---------------------+ +| 9 | G103 | 2024-03-28 11:58:00 | 2024-03-28 11:58:00 | +| 9 | G137 | 2024-03-30 18:56:00 | 2024-03-30 18:56:00 | ++-----------+---------+---------------------+---------------------+ +2 rows in set (0.03 sec) + +mysql> SELECT * FROM Trains; ++------+----------+-----------------+------------------+ +| ID | Property | StationID_start | StationID_arrive | ++------+----------+-----------------+------------------+ +| G103 | 1 | 1 | 9 | +| G137 | 0 | 1 | 9 | ++------+----------+-----------------+------------------+ +2 rows in set (0.01 sec) + +``` + +**多表连接查询** + +```mysql +SELECT + Passbys.TrainID, + Stations.`Name`, + Passbys.arrive_time, + Passbys.leave_time, + ( Passbys.leave_time - Passbys.arrive_time ) / 100 AS Stay_time +FROM + Passbys + JOIN Stations ON Passbys.StationID = Stations.ID; +``` + +![多表查询](多表查询.png) + + + +# 6. 题目6 + +> **请尝试练习在某些表上建立唯一索引和聚集索引的方法,并将建索引的语句写入建库脚本中。** + +```mysql +CREATE TABLE Passengers ( + ID BIGINT PRIMARY KEY, + `Name` VARCHAR ( 255 ) NOT NULL, + Phone_number BIGINT UNIQUE NOT NULL, + CHECK ( REGEXP_LIKE ( ID, '^\\d{18}$' ) ), + CHECK ( REGEXP_LIKE ( Phone_number, '^\\d{11}$' ) ) +); + +CREATE TABLE Users ( + ID INT AUTO_INCREMENT PRIMARY KEY, + `Password` VARCHAR ( 255 ) NOT NULL, + Phone_number BIGINT UNIQUE NOT NULL, + CitizenID BIGINT UNIQUE NOT NULL, + FOREIGN KEY ( Phone_number ) REFERENCES Passengers ( Phone_number ) ON DELETE CASCADE, + FOREIGN KEY ( CitizenID ) REFERENCES Passengers ( ID ) ON DELETE CASCADE +); +``` + +已在建库脚本中加入。 + +其中,含`PRIMARY KEY`的语句是聚集索引,含`UNIQUE`的语句是唯一索引。 + + + +# 7. 题目7 + +> **若某个表中涉及百万甚至千万级以上的数据,请提出仿真这些数据的方案,并在实验报告加以叙述。** + +目前的方案是使用爬虫爬取12306半个月内火车票的真实数据;对于购票的数据,使用Python随机生成。 diff --git a/Assignments/Assignment3/source/命令行插入.png b/Assignments/Assignment3/source/命令行插入.png new file mode 100644 index 0000000..d138ae2 Binary files /dev/null and b/Assignments/Assignment3/source/命令行插入.png differ diff --git a/Assignments/Assignment3/source/多表查询.png b/Assignments/Assignment3/source/多表查询.png new file mode 100644 index 0000000..a5ccaa0 Binary files /dev/null and b/Assignments/Assignment3/source/多表查询.png differ diff --git a/Assignments/Assignment3/source/窗口插入.png b/Assignments/Assignment3/source/窗口插入.png new file mode 100644 index 0000000..ef9dcd2 Binary files /dev/null and b/Assignments/Assignment3/source/窗口插入.png differ diff --git a/Assignments/Assignment3/src/DBLabScript_21281280.sql b/Assignments/Assignment3/src/DBLabScript_21281280.sql new file mode 100644 index 0000000..ea891c6 --- /dev/null +++ b/Assignments/Assignment3/src/DBLabScript_21281280.sql @@ -0,0 +1,147 @@ +DROP TABLE +IF + EXISTS Sold; +DROP TABLE +IF + EXISTS Transactions; +DROP TABLE +IF + EXISTS Passbys; +DROP TABLE +IF + EXISTS Tickets; +DROP TABLE +IF + EXISTS Seats; +DROP TABLE +IF + EXISTS Users; +DROP TABLE +IF + EXISTS Passengers; +DROP TABLE +IF + EXISTS Rides; +DROP TABLE +IF + EXISTS Trains; +DROP TABLE +IF + EXISTS Stations; +CREATE TABLE Passengers ( + ID BIGINT PRIMARY KEY, + `Name` VARCHAR ( 255 ) NOT NULL, + Phone_number BIGINT UNIQUE NOT NULL, + CHECK ( REGEXP_LIKE ( ID, '^\\d{18}$' ) ), + CHECK ( REGEXP_LIKE ( Phone_number, '^\\d{11}$' ) ) +); +CREATE TABLE Users ( + ID INT AUTO_INCREMENT PRIMARY KEY, + `Password` VARCHAR ( 255 ) NOT NULL, + Phone_number BIGINT UNIQUE NOT NULL, + CitizenID BIGINT UNIQUE NOT NULL, + FOREIGN KEY ( Phone_number ) REFERENCES Passengers ( Phone_number ) ON DELETE CASCADE, + FOREIGN KEY ( CitizenID ) REFERENCES Passengers ( ID ) ON DELETE CASCADE +); +CREATE TABLE Stations ( + ID INT AUTO_INCREMENT PRIMARY KEY, + `Name` VARCHAR ( 255 ) UNIQUE NOT NULL, + Province VARCHAR ( 255 ) NOT NULL, + City VARCHAR ( 255 ) NOT NULL +); +CREATE TABLE Trains ( + ID VARCHAR ( 255 ) PRIMARY KEY, + Property SMALLINT NOT NULL, + StationID_start INT NOT NULL, + StationID_arrive INT NOT NULL, + FOREIGN KEY ( StationID_start ) REFERENCES Stations ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( StationID_arrive ) REFERENCES Stations ( ID ) ON DELETE CASCADE +); +CREATE TABLE Seats ( + ID VARCHAR ( 255 ) PRIMARY KEY, + Type VARCHAR ( 255 ) NOT NULL, + TrainID VARCHAR ( 255 ) NOT NULL, + FOREIGN KEY ( TrainID ) REFERENCES Trains ( ID ) ON DELETE CASCADE +); +CREATE TABLE Tickets ( + ID INT AUTO_INCREMENT PRIMARY KEY, + Price DECIMAL ( 7, 2 ) NOT NULL, + Time_start DATETIME NOT NULL, + Time_arrive DATETIME NOT NULL, + StationID_start INT NOT NULL, + StationID_arrive INT NOT NULL, + SeatID VARCHAR ( 255 ) NOT NULL, + FOREIGN KEY ( StationID_start ) REFERENCES Stations ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( StationID_arrive ) REFERENCES Stations ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( SeatID ) REFERENCES Seats ( ID ) ON DELETE CASCADE, + CHECK ( Time_start <= Time_arrive ) +); +CREATE TABLE Transactions ( + ID BIGINT AUTO_INCREMENT PRIMARY KEY, + `Time` DATETIME NOT NULL, + Paid TINYINT NOT NULL, + `User` INT NOT NULL, + PassengerID BIGINT NOT NULL, + TrainID VARCHAR ( 255 ) NOT NULL, + StationID_start INT NOT NULL, + StationID_arrive INT NOT NULL, + Time_start DATETIME NOT NULL, + Time_arrive DATETIME NOT NULL, + SeatID VARCHAR ( 255 ) NOT NULL, + FOREIGN KEY ( `User` ) REFERENCES Users ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( PassengerID ) REFERENCES Passengers ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( TrainID ) REFERENCES Trains ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( StationID_start ) REFERENCES Stations ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( StationID_arrive ) REFERENCES Stations ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( SeatID ) REFERENCES Seats ( ID ) ON DELETE CASCADE, + CHECK ( Time_start < Time_arrive ) +); +CREATE TABLE Sold ( + TransactionID BIGINT NOT NULL, + TicketID INT NOT NULL, + FOREIGN KEY ( TransactionID ) REFERENCES Transactions ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( TicketID ) REFERENCES Tickets ( ID ) ON DELETE CASCADE +); +CREATE TABLE Passbys ( + StationID INT NOT NULL, + TrainID VARCHAR ( 255 ) NOT NULL, + arrive_time DATETIME NOT NULL, + leave_time DATETIME NOT NULL, + FOREIGN KEY ( StationID ) REFERENCES Stations ( ID ) ON DELETE CASCADE, + FOREIGN KEY ( TrainID ) REFERENCES Trains ( ID ) ON DELETE CASCADE, + CHECK ( arrive_time <= leave_time ) +); +INSERT INTO Stations ( `Name`, Province, City ) +VALUES + ( '北京南', '北京', '北京' ), + ( '沧州西', '河北', '沧州' ), + ( '济南西', '山东', '济南' ), + ( '徐州东', '江苏', '徐州' ), + ( '宿州东', '安徽', '宿州' ), + ( '蚌埠南', '安徽', '蚌埠' ), + ( '南京南', '江苏', '南京' ), + ( '无锡南', '江苏', '无锡' ), + ( '上海虹桥', '上海', '上海' ); +INSERT INTO Trains ( ID, StationID_start, StationID_arrive, Property ) +VALUES + ( 'G103', 1, 9, 1 ); +INSERT INTO Passbys ( StationID, TrainID, arrive_time, leave_time ) +VALUES + ( 1, 'G103', '2024-03-28 06:20:00', '2024-03-28 06:20:00' ), + ( 2, 'G103', '2024-03-28 07:13:00', '2024-03-28 07:15:00' ), + ( 3, 'G103', '2024-03-28 08:01:00', '2024-03-28 08:04:00' ), + ( 4, 'G103', '2024-03-28 09:07:00', '2024-03-28 09:09:00' ), + ( 5, 'G103', '2024-03-28 09:28:00', '2024-03-28 09:33:00' ), + ( 6, 'G103', '2024-03-28 09:56:00', '2024-03-28 09:58:00' ), + ( 7, 'G103', '2024-03-28 10:40:00', '2024-03-28 10:43:00' ), + ( 8, 'G103', '2024-03-28 11:27:00', '2024-03-28 11:29:00' ), + ( 9, 'G103', '2024-03-28 11:58:00', '2024-03-28 11:58:00' ); +SELECT + Passbys.TrainID, + Stations.`Name`, + Passbys.arrive_time, + Passbys.leave_time, + ( Passbys.leave_time - Passbys.arrive_time ) / 100 AS Stay_time +FROM + Passbys + JOIN Stations ON Passbys.StationID = Stations.ID; \ No newline at end of file diff --git a/Assignments/Assignment3/作业3_21281280_柯劲帆.pdf b/Assignments/Assignment3/作业3_21281280_柯劲帆.pdf new file mode 100644 index 0000000..365b475 Binary files /dev/null and b/Assignments/Assignment3/作业3_21281280_柯劲帆.pdf differ