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
Trang 1VIỆN TOÁN ỨNG DỤNG VÀ TIN HỌC -o0o -
Báo cáo bài tập lớn Môn Cơ sở dữ liệu Nhóm 15: Financial Services
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
Trang 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:
Trang 31.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.TRUY VẤN DỮ LIỆU 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 hoà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ỐI ƯU TRUY VẤN 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
Trang 42.2.3 Transaction xóa một account 34
3.TẠO VÀ CHÉP DỮ LIỆU SANG CSDL MỚI CÙNG CẤU TRÚC 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
Trang 5Phầ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 khoá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
Trang 6Dị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
Trang 7
1.2.2 Lược đồ E-R diagram
Trang 8
1.2.3 Lược đồ R-E diagram
Trang 91.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 toá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 toá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
Trang 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
Trang 11Phầ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:
Trang 12AS '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ả:
Trang 131.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ả:
Trang 141.5 Kiểm tra tình trạng hoàn thành các khoản vay
Output: Tình trạng hoà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ả:
Trang 151.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ả:
Trang 161.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ả:
Trang 171.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ả:
Trang 181.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ả:
Trang 191.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ả:
Trang 212 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:
Trang 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
Trang 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:
Trang 24
So sánh hiệu năng:
Số hàng phải duyệt Crm_call_
center_logs 3006 rows 416 rows Giảm: 7.2 lần 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:
Trang 25
Sử dụng Partition Range:
Kết quả:
Trang 26Hiệ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:
Trang 27Kế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
Trang 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
Trang 30Kế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:
Trang 31Kết quả sau khi gọi procedure xóa account: account A00011383 đã được xóa khỏi bảng
2 Transaction
Trang 322.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ì toà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 toà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:
Trang 332.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
Trang 34Sau 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:
Trang 35Kết quả sau khi thực hiện transaction:tài khoản có mã id là A00000001 đã được xóa:
Trang 363 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