Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (12.1 MB, 42 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
VIỆN TOÁN ỨNG DỤNG VÀ TIN HỌC ---o0o---
Giảng viên hướng dẫn: Nguyễn Danh Tú
Sinh viên thực hiện: Hoàng Khánh Nhàn 20195906 Nguyễn Ngọc Huyền 20195890 Nguyễn Xuân Yến 20195945 Vũ Thị Thùy Trang 20195933 Nguyễn Đức Mạnh 20195900
Hà Nội – 2021
</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">Đánh giá nhóm
1. Đánh giá kết quả của nhóm trưởng:
2. Đánh giá của giảng viên:
</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">1.2.1 Thông tin số lượng bản ghi của các bảng dữ liệu ... 6
1.2.2 Lược đồ E-R diagram ... 7
1.2.3 Lược đồ R-E diagram ... 8
1.2.4 Đánh giá mức độ chuẩn hóa ... 9
PHẦN 2: TRUY VẤN DỮ LIỆU ... 11
1.T<small>RUY VẤN DỮ LIỆU</small> ... 11
1.1 Kiểm tra các tài khoản còn nợ cho đến hiện tại ... 11
1.2 Kiểm tra tổng tiền thu hộ hoặc các giao dịch chuyển đến của từng ngân hàng .... 11
1.3 Chương trình tặng quà ngày 08/03 ... 12
1.4 Kiểm tra tình trạng các khoản vay trên 20 năm ... 13
1.5 Kiểm tra tình trạng hồn thành các khoản vay ... 14
1.6 Kiểm tra số dư của tài khoản sau giao dịch cuối cùng ... 15
1.7 Số lượng khách hàng nam/ nữ theo từng khu vực ... 16
1.8 Tỉ lệ đánh giá kém theo khu vực... 17
1.9 Đếm số lượng order của khách hàng ... 18
1.10 Kiểm tra thơng tin khách hàng có cuộc gọi bị treo ... 19
2.T<small>ỐI ƯU TRUY VẤN</small> ... 21
2.1.2 Thuộc tính của transaction: ... 32
2.2 Transaction trong bài tập lớn. ... 32
2.2.1 Transaction thêm khách hàng có mã district mới... 32
2.2.2 Transaction đổi địa chỉ khách hàng. ... 33
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">2.2.3 Transaction xóa một account. ... 34
3.T<small>ẠO VÀ CHÉP DỮ LIỆU SANG </small>CSDL<small> MỚI CÙNG CẤU TRÚC</small> ... 36
3.1 Tạo mới cơ sở dữ liệu ... 36
3.2 Sinh câu lệnh tạo procedure: ... 37
3.3 Thực hành với procedure ... 39
PHẦN 4: KẾT LUẬN ... 41
Tài liệu tham khảo ... 42
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">Phần 1: Đề tài nhóm 1.1 Tổng quan về cơ sở dữ liệu
Financial Services hay dịch vụ tài chính là những dịch vụ có liên quan chặt chẽ đến quá trình lưu chuyển và sử dụng vốn, tiền tệ trong nền kinh tế.
Ngành dịch vụ tài chính gồm nhiều loại hình kinh doanh, bao gồm các cơng ty thẻ tín dụng, cơng ty mơi giới và nhà cung cấp dịch vụ thế chấp.
Financial Services được chia thành 2 nhóm chính:
Dịch vụ bảo hiểm và những dịch vụ liên quan tới bảo hiểm: o Bảo hiểm trực tiếp (bao gồm cả đồng bảo hiểm); o Tái bảo hiểm và nhượng tái bảo hiểm; o Trung gian bảo hiểm như mơi giới, đại lí;
o Các dịch bổ trợ bảo hiểm như tư vấn thống kê bảo hiểm. Dịch vụ ngân hàng và những dịch vụ tài chính khác:
o Những dịch vụ ngân hàng thông thường:
Dịch vụ nhận tiền gửi và các nguồn tài chính phải hoàn trả khác từ nhân dân;
Dịch vụ cho vay dưới các hình thức, bao gồm tín dụng tiêu dùng, tín dụng thế chấp, mua nợ và tài trợ các dịch vụ cho hoạt động giao dịch thương mại;
Dịch vụ bảo lãnh và thế chấp; Dịch vụ cho thuê tài chính. o Những dịch vụ tài chính khác:
Dịch vụ kinh doanh chứng khoán và các sản phẩm phái sinh như hợp đồng tương lai, hợp đồng quyền chọn,... Dịch vụ ngoại hối;
Dịch vụ thanh toán và thanh toán bù trừ cho các tài sản tài chính, bao gồm chứng khốn, các cơng cụ phái sinh và các cơng cụ tài chính được thỏa thuận khác
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">Dịch vụ quản lí tài sản như quản lí tiền mặt hoặc đầu tư gián tiếp, tất cả các hình thức đầu tư tập thể, quản lí quĩ hưu trí, các dịch vụ tín thác, gửi tiền và lưu kho tiền tệ; Dịch vụ cung cấp và chuyển giao thông tin tài chính và xử lí dữ liệu tài chính và các phần mềm có liên quan do nhà cung cấp dịch vụ tài chính khác cung cấp. 1.2 Thơng tin CSDL
Cơ sở dữ liệu được download từ trang Kaggle.com thống kê dữ liệu của ngân hàng quốc gia Eagle năm 1999 với kích thước khoảng 163MB.
1.2.1 Thơng tin số lượng bản ghi của các bảng dữ liệu
khách hàng
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">
1.2.2 Lược đồ E-R diagram
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">
1.2.3 Lược đồ R-E diagram
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">1.2.4 Đánh giá mức độ chuẩn hóa Chuẩn 1
Vì các trường thuộc tính đều là nguyên tố và không chứa giá trị phức, giá trị tính tốn nên hầu hết các bảng trong cơ dữ liệu đều đạt chuẩn 1 trừ bảng crm_call_center, chứa trường thuộc tính được tính tốn từ trường thuộc tính khác.
Hình ảnh bảng crm_call_center. Chuẩn 2
Để đạt chuẩn 2 thì quan hệ đó: Là 1NF
Các thuộc tính khơng khóa phải phụ thuộc hàm đầy đủ vào khóa chính.
Ta nhận thấy các bảng đã đạt chuẩn 1 đều đã đạt chuẩn 2 và trừ bảng crm_call_center vì chưa đạt chuẩn 1.
Bảng client đạt chuẩn 2
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">
Bảng account Chuẩn BCNF
Một quan hệ ở dạng chuẩn BCNF nếu quan hệ đó: Là 3NF
Khơng có thuộc tính khóa mà phụ thuộc hàm vào thuộc tính khơng khóa
Các bảng đạt chuẩn BCNF là: crm_events, disposition, orders.
Để tiếp tục chuẩn hóa các bảng ta sẽ phải tách bảng tuy nhiên trong thực tế sẽ khiến bảng ER bị dư thừa; quá trình truy vấn hay cập nhật dữ liệu khơng bị ảnh hưởng vì thế ta sẽ khơng chuẩn hóa tiếp.
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">Phần 2: Truy vấn dữ liệu 1. Truy vấn dữ liệu
1.1 Kiểm tra các tài khoản còn nợ cho đến hiện tại
Output: Thông tin các tài khoản còn nợ cho đến thời điểm hiện tại Mã nguồn chính:
SELECT loan_id, account_id, amount, duration,
timestampdiff(month, fulldate, curdate()) AS 'Total past payments', amount- payments*timestampdiff(month, fulldate, curdate()) AS 'Loan balance', status, fulldate, location
FROM financial_services.loan
WHERE timestampdiff(month, fulldate, curdate())<duration ORDER BY loan_id ASC;
Giao diện kết quả:
1.2 Kiểm tra tổng tiền thu hộ hoặc các giao dịch chuyển đến của từng ngân hàng Output: Tổng tiền thu hộ hoặc các giao dịch chuyển đến của từng ngân hàng Mã nguồn chính:
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">AS 'Remittance to Another Bank' FROM financial_services.trans
GROUP BY bank ORDER BY bank ASC; Giao diện kết quả:
1.3 Chương trình tặng quà ngày 08/03
Output: Thông tin các khách hàng sinh vào tháng 3 hoặc có số tuổi chia hết cho 10 Mã nguồn chính:
SELECT client_id, sex, fulldate,
concat(first,' ', middle,' ', last) AS fullname, age, phone, email, address_1, address_2 FROM financial_services.client
WHERE sex='Female'
AND (fulldate LIKE ('%-03-%') OR (age mod 10)=0); Giao diện kết quả:
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">1.4 Kiểm tra tình trạng các khoản vay trên 20 năm
Output: Thông tin các khoản vay trên 20 năm tính đến năm 2017 Mã nguồn chính:
SELECT loan_id, funded_amount, funded_date, `duration years`, `duration months`, `10 yr treasury index date funded`, `interest rate percent`,payments,`loan balance`, `total past payments`
FROM luxury_loan_portfolio WHERE
(funded_date>='2017-01-01') AND (funded_date<='2017-12-31') AND (`duration years`>=20); Giao diện kết quả:
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">1.5 Kiểm tra tình trạng hồn thành các khoản vay
Output: Tình trạng hồn thành của các khoản vay của các khách hàng có thời gian làm việc từ 5 năm trở lên
Mã nguồn chính:
SELECT loan_id, funded_amount, `duration months`, payments, CONCAT(firstname,' ',middlename,' ',lastname) AS fullname, phone, title, `employment length`,
ROUND((1- (`loan balance`/funded_amount))*100,2) as 'Tinh trang hoan thanh khoan vay (%)'
FROM financial_services.luxury_loan_portfolio WHERE `employment length`>=5;
Giao diện kết quả:
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">1.6 Kiểm tra số dư của tài khoản sau giao dịch cuối cùng Output: Số dư của các tài khoản sau giao dịch cuối cùng Mã nguồn chính:
SELECT account_id, balance FROM (
SELECT max(trans_id) as 'final_trans_id' FROM trans
GROUP BY account_id ORDER BY account_id) AS newtable
INNER JOIN trans
ON newtable.final_trans_id= trans.trans_id; Giao diện kết quả:
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">1.7 Số lượng khách hàng nam/ nữ theo từng khu vực
Output: Số lượng các khách hàng nam và nữ theo từng khu vực Mã nguồn chính:
SELECT district_id, district.city, district.state_name, district.division,
SUM(IF(sex='Female',1,0)) AS Female, SUM(IF(sex='Male',1,0)) AS Male FROM client
INNER JOIN district USING(district_id) GROUP BY district_id ORDER BY district_id ASC; Giao diện kết quả:
</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">1.8 Tỉ lệ đánh giá kém theo khu vực
Output: Tỉ lệ (%) đánh giá kém của các khu vực Mã nguồn chính:
SELECT district_id, city, state_name, region, division, bad, good, round(100*bad/(bad+good),2) AS 'Ti le danh gia kem (%)' FROM(
SELECT district_id,
SUM(IF (stars>3, 1, 0 )) AS good, SUM(IF (stars<=3, 1, 0 )) AS bad FROM crm_reviews
GROUP BY district_id ) AS newtable
INNER JOIN district USING (district_id); Giao diện kết quả:
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">1.9 Đếm số lượng order của khách hàng
Output: Truy vấn số lượng order của từng khách hàng. Mã nguồn chính:
SELECT account_id , client_id ,
CONCAT(first, ' ', middle, ' ', last) AS 'fullname' , COUNT(order_id) AS 'count'
FROM orders
INNER JOIN disposition USING (account_id) INNER JOIN client
USING (client_id) GROUP BY client_id ORDER BY account_id ASC; Giao diện kết quả:
</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">1.10 Kiểm tra thơng tin khách hàng có cuộc gọi bị treo Output: Thông tin các khách hàng bị treo cuộc gọi Mã nguồn chính:
SELECT crm_call_center_logs.Date_received, client.client_id, crm_call_center_logs.call_id,
CONCAT(first, ' ', middle, ' ', last) AS 'fullname' , client.sex, priority,phone_final,
crm_call_center_logs.outcome FROM crm_call_center_logs INNER JOIN client
ON crm_call_center_logs.phone_final=client.phone WHERE outcome='HANG'
ORDER BY date_received asc, priority desc ; Giao diện kết quả:
</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">2. Tối ưu truy vấn 2.1 Index: 2.1.1 Index:
Index trong SQL là bảng tra cứu đặc biệt mà cơng cụ tìm kiếm cơ sở dữ liệu có thể sử dụng để tăng nhanh thời gian và hiệu suất truy xuất dữ liệu.
• Giúp cải thiện tốc độ cho các câu lệnh SELECT hay JOIN có các mệnh đề WHERE. • Làm cho các câu lệnh thay đổi dữ liệu: INSERT, UPDATE và DELETE
chậm hơn.
2.1.2 Các ví dụ câu lệnh Index: VD1:
Trước khi dùng Index:
Sử dụng Index:
</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">
Để nhìn thấy rõ hiệu quả của index, ta nhìn vào bảng đánh giá hiệu năng:
- Thời gian đọc kết quả dòng đầu: 25.151 (ms)
- Thời gian đọc kết quả dòng đầu: 2.531 (ms)
- Số hàng phải duyệt 762510 (rows)
- Số hàng phải duyệt 1113 (rows)
Giảm: 685 lần
</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">
VD2: Truy vấn câu lệnh: Kiểm tra thông tin khách hàng bị treo cuộc gọi:
Trước khi dùng Index:
Sử dụng Index:
</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">
So sánh hiệu năng:
Số hàng phải duyệt Crm_call_
center_logs <sup>3006 rows </sup> <sup>416 rows Giảm: 7.2 lần </sup>client 5257 rows 1 rows Giảm: 5257 lần
2.2 Partition: 2.2.1 Partition:
Partition là quá trình phân chia
table thành các phân vùng nhỏ theo một quy tắc nào đó được gọi là partition function.
Những điều cần lưu ý khi sử dụng partition Partition sẽ được bắt đầu từ index bằng 0, Số Partition có thể chia tối đa là 8192 partition.
Với dữ liệu là datetime thì những function TO_DAYS(), YEAR(), TO_SECONDS()... là cực kì hữu ích khi sử dụng trong partition, những hàm này sẽ trả về giá trị INT or NULL.
Tuy nhiên, nếu table quá ít dữ liệu, hoặc dữ liệu chưa đủ lớn - cỡ khoảng 1 triệu records thì việc partition
table cũng khơng có quá nhiều sự khác biệt. 2.2.2 Các loại Partition:
Partition Range Trước khi tối ưu:
</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">
Sử dụng Partition Range:
Kết quả:
</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">Hiệu năng tối ưu:
Số hàng phải duyệt 788979 (rows)
Số hàng phải duyệt 1 (rows)
Giảm: 788979 lần
Partition List Trước khi tối ưu:
Sử dụng Partition List:
</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">Kết quả:
Hiệu năng tối ưu:
Số hàng phải duyệt 5412 (rows)
Số hàng phải duyệt 268(rows)
Giảm: 20.2 lần
</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">
Phần 3: Cập nhật dữ liệu
1. Thủ tục cập nhật dữ liệu(procedure): 1.1 Giới thiệu về thủ tục.
1.1.1 Định nghĩa: Một thủ tục được lưu trữ(a stored procedure)là một phân khúc các câu lệnh SQL khai báo được lưu trữ bên trong máy chủ MySQL.
1.1.2 Lợi ích:
Giảm lưu lượng mạng: Các thủ tục được lưu trữ giúp giảm lưu lượng mạng giữa các ứng dụng và MySQL Server. Bởi thay vì gửi nhiều câu lệnh SQL dài dòng, các ứng dụng chỉ phải gửi tên và tham số của các thủ tục được lưu trữ.
Tập trung logic nghiệp vụ: Bạn có thể sử dụng các thủ tục được lưu trữ để triển khai logic nghiệp vụ có thể được sử dụng lại bởi nhiều ứng dụng. Các thủ tục được lưu trữ giúp giảm thiểu nỗ lực sao chép cùng một logic trong nhiều ứng dụng và làm cho cơ sở dữ liệu của bạn nhất quán hơn Tăng tính bảo mật.
1.1.3 Bất lơi:
Sử dụng nhiều tài nguyên.
Khó sửa lỗi: khó để gỡ lỗi các thủ tục được lưu trữ bởi MySQL không cung cấp bất kỳ cơ sở nào để gỡ lỗi các thủ tục được lưu trữ giống như các sản phẩm cơ sở dữ liệu doanh nghiệp khác như Oracle và SQL Server.
Bảo trì: Việc phát triển và duy trì các thủ tục được lưu trữ thường đòi hỏi một bộ kỹ năng chuyên biệt mà không phải nhà phát triển ứng dụng nào cũng có. Điều này có thể dẫn đến các vấn đề trong cả phát triển và bảo trì ứng dụng.
1.2 Các thủ tục trong bài tập lớn:
Trong bài tập lớn, nhóm chúng em đã tạo ra tất cả 36 procedure.
</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">Kết quả sau khi gọi procedure thêm account: account có account_id là A00011383 đã xuất hiện ngay dòng đầu tiên.
1.2.2 Xóa account:
Mã nguồn:
</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">Kết quả sau khi gọi procedure xóa account: account A00011383 đã được xóa khỏi bảng.
2. Transaction.
</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">2.1 Giới thiệu về transaction.
2.1.1 Khái niệm: là tiến trình thực hiện một nhóm các câu lệnh SQL. Các câu lệnh này được thực thi một cách tuần tự và độc lập. Một Transaction được thực hiện thành công khi tất cả câu lệnh đều thành cơng, khi đó tất cả các thay đổi dữ liệu được thực hiện trong Transaction được lưu vào cơ sở dữ liệu. Tuy nhiên, nếu chỉ một trong số đó thất bại thì tồn bộ tiến trình sẽ thất bại, đồng nghĩa với việc dữ liệu phải rollback về trạng thái ban đầu (dữ liệu được khôi phục về trạng thái trước khi thực hiện Transaction).
2.1.2 Thuộc tính của transaction:
Tính bảo tồn: khi một bước trong tiến trình thất bại, dữ liệu được khơi phục về trạng thái ban đầu, tránh tình trạng sai lệch dữ liệu.
Tính nhất quán: đảm bảo rằng cơ sở dữ liệu thay đổi chính xác các trạng thái khi một transaction được thực thi thành công.
Tính độc lập: đảm bảo các transaction hoạt động và thực thi độc lập với nhau.
Tính bền vững: đảm bảo rằng kết quả của một transaction được xác định, khơng có chuyện dữ liệu của Transaction sau khi thực thi có thể chuyển lại trạng thái dữ liệu lúc trước khi thực hiện.
2.2 Transaction trong bài tập lớn.
Trong bài tập lớn, chúng em đã tạo ra ba transaction là tạo một district mới, thay đổi địa chỉ của một khách hàng và xóa một account.
2.2.1 Transaction thêm khách hàng có mã district mới.
Mơ tả tình huống: Khi thêm một khách hàng mới mà địa chỉ là một thành phố chưa có mã district, cần tiến hành
thêm mã district mới, sau đó thêm khách hàng đó vào bảng client. Mã nguồn:
</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">2.2.2 Transaction đổi địa chỉ khách hàng.
Mơ tả tình huống: Khi một khách hàng chuyển nơi ở, khi đó cần cập nhật lại địa chỉ của khách hàng đó.
Kết quả sau khi chạy transaction:
Trước khi chạy thì khách hàng C0000001 có địa chỉ là 387 Wellington Ave, Albuquerque, NM, district_id là 18.
</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">Sau khi thực hiện khách hàng C00000001 đã được đổi địa chỉ thành 80 Second St, New York City, NY, district_id là 1:
2.2.3 Transaction xóa một account.
Mơ tả tình huống: khi một khách hàng khơng sử dụng dịch vụ, yêu cầu hủy tài khoản của ngân hàng, thì cần xóa tài khoản và các thơng tin phụ thuộc vào tài khoản.
Mã nguồn:
</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">Kết quả sau khi thực hiện transaction:tài khoản có mã id là A00000001 đã được xóa:
</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">3. Tạo và chép dữ liệu sang CSDL mới cùng cấu trúc 3.1 Tạo mới cơ sở dữ liệu
Có nhiều cách để tạo được một cơ sở dữ liệu mới có cấu trúc giống cơ sở dữ liệu cũ nhưng do chưa hiểu rõ nên chúng em dùng cách đơn giản hơn là sử dụng công cụ Reverse \ Forward Engineer
Reverse Engineer giúp chúng ta tạo ra 1 diagram từ cơ sở dữ liệu cũ, và từ diagram đó, tiếp tục sử dụng công cụ Forward Engineer ta sẽ được các câu lệnh dùng để sinh ra một cơ sở dữ liệu có cùng cấu trúc với cơ sở dữ liệu ban đầu.
</div>