1. Trang chủ
  2. » Luận Văn - Báo Cáo

bài tập lập trình cơ sở dữ liệu

33 3 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 33
Dung lượng 318,53 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Tên hàng Đơn giá Đơn vị tính Số lượng Thành Tiền Hãy giải thích các vấn đề nảy sinh sau đây khi thiết kế CSDL này: -Dư thừa dữ liệu Redundancy -Không nhất quán Inconsistency -Dị thường k

Trang 1

Tên hàng

Đơn giá

Đơn

vị tính

Số lượng

Thành Tiền

Hãy giải thích các vấn đề nảy sinh sau đây khi thiết kế CSDL này:

-Dư thừa dữ liệu (Redundancy)

-Không nhất quán (Inconsistency)

-Dị thường khi thêm bộ (Insertion anomalies)

-Dị thường khi xóa bộ (Deletion anomalies)

Giải

liệu về khách hàng đó sẽ lặp lại trong nhiều bộ của quan hệ trên sơ đồ này Cụ thể, mỗi khi xuất

hiện Mã KH trong một bộ thì tên và địa chỉ của họ lặp lại trong quan hệ - Không nhất quán

(Inconsistency): dị thường xuất hiện khi sửa dữ liệu là hệ quả của việc dư thừa dữ liệu Ví dụ khi

Trang 2

sửa đổi địa chỉ khách hàng có mã KH04 từ “Đống đa” thành “Tây Hồ”, nếu chúng ta chỉ sửa đổi

ở 1 bộ nào đó còn các bộ khác vẫn giữ nguyên Khi đó xảy ra hiện thượng một Khách hàng lạikhông có một địa chỉ duy nhất

cả, khi thêm 1 bộ giá trị về họ chúng ta không thể đưa mặt hàng và giá cả vào bộ này trong quan

hệ

khi đó quan hệ chỉ có một bộ dữ liệu lưu trữ vầ khách hàng này Khi chúng ta xóa bộ dữ liệu liênquan đến lần mua này thì sẽ làm mất thông tin về khách hàng đó

Câu hỏi số 2

1 Hãy xác định tập thuộc tính và miền giá trị tương ứng của quan hệ BÁN HÀNG nói trên

2 Hãy xác định tập phụ thuộc hàm trong quan hệ BÁN HÀNG nói trên

3 Hãy viết lược đồ quan hệ BÁN HÀNG nói trên

Dom(Thành Tiền}= real

2 Tập phụ thuộc hàm

F= {Số hóa đơn -> Mã KH, Số hóa đơn -> Tên KH, Số hóa đơn -> Địa chỉ KH, Mã KH -> Tên KH,

Mã KH -> Địa chỉ KH, Mã hàng -> Tên hàng, Mã hàng -> Đơn giá, Mã hàng -> Đơn vị tính}

3 Lược đồ quan hệ

R= <U, F>

Với U= {Ngày bán, Số hóa đơn, Mã KH, Tên KH, Địa chỉ KH, Mã hàng, Tên hàng, Đơn giá, Đơn vị tính, Số lượng, Thành tiền} Và

F= {Số hóa đơn -> Mã KH, Số hóa đơn -> Tên KH, Số hóa đơn -> Địa chỉ KH, Mã KH -> Tên KH,

Mã KH -> Địa chỉ KH, Mã hàng -> Tên hàng, Mã hàng -> Đơn giá, Mã hàng -> Đơn vị tính}

Trang 3

- Tương tự như vậy, tìm tiếp các phụ thuộc hàm có vế trái là A, C, D và các tích của chúng, ta có:

D → H, DA → CE Do đó thêm H, E vào X1 ta được X2 = ACDEH

- Tương tự như vậy, tìm tiếp các phụ thuộc hàm có vế trái là A,C, D,E,H và các tích của chúng, ta

có X3 = ACDEH Bước 3: (AC)+ = ACDEH

2 Tìm phủ thiểu của tập F

Trang 5

Bước 2: Loại bỏ các thuộc tính dư thừa

Xét từng thuộc tính ở vế trái của phụ thuộc hàm có từ 2 thuộc tính trở lên xem theo bảng sau

Xét phụ thuộc hàm Thuộc tính Kiểm tra tính dư thừa của thuộc tính F2

BE → G B (E) + = {DEG} có chứa G => dư thừa =>

loại thuộc tính B ra khỏi phụ thuộc

hàm BE → G, ta có: E → G

E (B) + = {B} không chứa G => Không dư

thừa F2= {A→ B, A → C, E →G, E → D, D →G, AG→

B, AG → C}

AG → B A (G) + = G không chứa B => không dư thừa

G (A) + = ABC có chứa B => dư thừa =>

Loại thuộc tính G ra khỏi phụ thuộc hàm AG → B, ta có: A -> B

F2 = {A→ B, A → C, E →

G, E → D, D →G, AG → C}

AG → C A (G) + = G không chứa C => không dư thừa

Xét phụ thuộc hàm Thuộc tính Kiểm tra tính dư thừa của thuộc tính F2

G (A) + = ABC có chứa C => dư thừa =>

loại thuộc tính G ra khỏi phụ thuộc

Trang 6

Bước 3: Loại bỏ các phụ thuộc hàm dư thừa

Áp dụng thuật toán tính phủ không dư thừa với đầu vào là F2: chúng ta đặt F0 = F2

F0 = {A→B, A→C, E→G, E→D, D→G}

Và kiểm tra tất cả các phụ thuộc hàm (PTH) theo thứ tự trên như bảng sau

A → B {A→C, E→G, E→D, D→G} A+ = AC, không chứa B,

không dư thừa

F1=F0

A → C {A→B, E→G, E→D, D→G} A+ = AB, không chứa C,

không dư thừa

F2=F1

E → G {A→B,A→C, E→D, D→G} E+ = EDG, có chứa G

nên dư thừa => Loại

F3= {A→B,A→C, E→D,D→G}

E → D {A→B, A→C, D→G} E+ = E không chứa D

nên không dư thừa

F4 = F3

D → G {A→B, A→C, E→D} D+ = D không chứa G

nên không dư thừa F5=F4

Sau khi thử xong tất cả các phụ thuộc hàm trong lược đồ Kết quả cuối cùng ta có phủ tối thiểu

F tối thiểu = {A→B, A→C, E→D, D→G}

Đáp án bài tập số 6

Trang 7

a) Tìm tập khóa của lược đồ này

b) Tìm khóa tối thiểu của lược đồ này

Giải

a) Tìm tập khóa của lược đồ

Bước 1: L = {ABC} R = {AB} Từ đó có: TN = U\R = {C} và TG = L  R = {AB}

Bước 2: Vì TG # 0 nên ta làm tiếp bước 3

Bước 3: Ta có tập con Xi của tập TG = {0, A, B, AB} Bước

4: tìm siêu khóa Si theo bảng sau:

Trang 8

Vậy ta có tập siêu khóa S = {C, AC, BC, ABC}

Bước 5: Tuy nhiên, vì C chứa trong AC, BC và ABC nên loại bỏ siêu khóa AC, BC và ABC rakhỏi tập siêu khóa

Vậy ta có, tập khóa K = {C} là khóa của lược đồ quan hệ

b) Tìm khóa tối thiểu của lược đồ

Và F = {AB ->B, BI -> ACD, ABC -> D, H->I, ACE -> BCG, CG -> AE} Hãy

tìm các siêu khóa và 1 khóa tối thiểu của lược đồ quan hệ này

Bước 2: Vì TG # 0 nên ta làm tiếp bước 3

Bước 3: Ta có tập con Xi của tập TG = {0, A, B, C, E, G, I

AB, AC, AE, AG, AI, BC, BE, BG, BI, CE, CG, CI, EG, EI, GI,

ABC, ABE, ABG, ABI, ACE, ACG, ACI, AEG, AEI, AGI,

BCE, BCG, BCI, BEG, BEI, BGI, CEG, CEI, CGI, EGI,

ABCE, ABCG, ABCI, ABEG, ABEI, ABGI,

BCEG, BCEI, BCGI, CEGI,

ABCEG, ABCEI, ABCGI, BCEGI, ABCEGI}

Trang 9

Bước 4: tìm siêu khóa Si theo bảng sau

Xi TN  Xi Bao đóng của

TN  Xi

Kiểm tra (TN Xi)+ = U+ ?

Trang 10

ACI ACHI ACHI != U +

Trang 11

Vậy ta có tập siêu khóa S = {BEH, BGH, CGH, ABEH, ABGH, ACGH, BCEH, BGEH, BEHI,BGHI, CEGH, CGHI, ABCEH, ABCGH, ABEHI, ABGHI, BCEGH, BCEHI, BCGHI, CEGHI,ABCEGH, ABCEHI, ABCGHI, BCEGHI, ABCEGHI}

Bước 5: Sau khi rút gọn ta có tập khóa K = {BEH, BGH, CGH} là khóa của lược đồ quan hệ

2 Tìm một khóa và khóa tối thiểu Giải:

K

• => Kết quả Khóa là K= {CGH}

Đáp án bài tập số 8 - ONLINE

Câu hỏi 1:

Cho quan hệ: R(MaSV, MaMonhoc, Diem)

Với dữ liệu được cho trong bảng sau

Mã sinh viên Mã môn học Điểm

Trang 12

Thực hiện phép kết nối tự nhiên 2 quan hệ R1*R2 ta có

Mã sinh viên Mã môn học Điểm

Trang 13

Giả sử R được tách thành D = {U1, U2, U3, U4, U5} với

U1 = {AD}, U2 = {AB}, U3 = {BE}, U4 = {CDE} và U5 = {AE}

Hãy sử dụng thuật toán để kiểm tra xem phép tách này có được bảo toàn thông tin haykhông?

Trang 15

PHONGBAN(MaPB, TenPB, DiaChi, DTnoibo)

với dữ liệu được cho dưới dạng bảng sau

PHÒNG BAN

Mã phòng ban Tên phòng ban Địa chỉ Điện thoại nội bộ

Trang 17

DIEMTHI(MaHP, MaSV, TenSV, NgaySinh, Diem)

Tương ứng với hai bảng sau đây

Hãy kiểm tra xem quan hệ này đã đạt chuẩn 2NF hay chưa? Nếu chưa, hãy chuẩn hóa về 2NF

Giải:

Quan hệ HOCPHAN(MaHP, TenHP) đạt chuẩn 2NF

Quan hệ DIEMTHI(MaHP, MaSV, TenSV, NgaySinh, Diem) không đạt chuẩn 2NF vì có sự phụ thuộc MaSV -> TenSV, NgaySinh nên phải tách thành 2 quan hệ

DIEMTHI(MaHP,MaSV,Diem) và SINHVIEN(MaSV, TenSV, NgaySinh)

Bước 1: Tìm tất cả các khóa của R Xác định tập thuộc tính không khoá

Ta có L = {ABC}, R = {ACD}, TN = {B}, TG = {AC}

Vì TG # 0 và tập con Xi của tập TG = {0, A, C, AC}

Tìm siêu khóa Si theo bảng sau:

Trang 18

Xi TN  Xi Bao đóng của

TN  Xi

Kiểm tra (TN  Xi)+ =

U+ ?

Siêukhóa

Loại bỏ khóa ABC vì chứa AB và BC, ta có tập siêu khóa S = {AB, BC}

Vậy các thuộc tính khóa là {A, B, C} và thuộc tính không khóa là {D}

Bước 2: Tính (Xi)+ trong đó Xi là tập con thực sự của các khóa K

- X1+ =A+ = A

- X2+ = B + = BD

- X3+ = C + = C

Bước 3: Vì X2+ chứa thuộc tính không khoá của D nên R không đạt chuẩn 2NF

Cách 2: Khóa là AB, mà có phụ thuộc hàm B->D có D phụ thuộc vào 1 bộ phận của khóa => Nên ko đạt chuẩn 2NF

Bước 1: Tìm tất cả các khóa của R

1) L = {ABCD} R = {ABCD} Từ đó có: TN = U\R = {0} và TG = L  R = {ABCD} 2) Vì TG # 0 và tập con Xi của tập TG = {0, A, C, B, C, D, AB, AC, AD, BC, BD, CD, ABC, ABD, BCD, ABCD}

3) Tìm siêu khóa Si theo bảng sau:

TN  Xi

Kiểm tra (TN  Xi)+ =

U+ ?

Siêukhóa

Trang 19

Sau khi loại bỏ các thuộc tính chứa khóa {C} và khóa {AB} chúng ta có tập khóa

K = {C, AB, AD}

Bước 2: tập thuộc tính không khóa là {0}

Bước 3: Mọi phụ thuộc hàm đều có vế phải là thuộc tính khóa nên R đạt chuẩn 3NF

P/s: Tham khảo định nghĩa 3NF

Trang 21

ĐÁP ÁN BÀI TẬP SỐ 9 - ONLINE

Cho CSDL QUAN LY ĐIỂM THI với lược đồ dữ liệu như sau

SINHVIEN(MaSV, HoTen, NgaySinh, Que, GioiTinh, MaLop)

LOP(MaLop, TenLop)

MONHOC(MaMH, TenMH) DIEM(MaSV,

MaMH,DiemThi)

Yêu cầu:

1 Hãy dùng biểu thức đại số quan hệ và câu lệnh SQL để thực hiện các truy vấn sau: Q2.1.

Cho thông tin về những sinh viên sinh trước năm 2001, quê ở Hải phòng

Trang 22

MaSV,TenSV,Que(SINHVIEN Malop = Lop Malop  Lop Malop = 'SITDE06001'  Que = 'Ha Noi' (SINHVIEN x LOP))

C2:

MaSV,TenSV,Que(Que = 'Ha Noi' (SINHVIEN) *  Lop Malop = 'SITDE06001'(LOP)

SQL:

***chú ý thêm N trước dãy ký tự để xử lý lỗi phông Unicode trong SQL SERVER, khi viết

câu lệnh SQL lý thuyết thì bỏ ký tự N này đi C1:

SELECT MaSV, TenSV, Que

FROM SINHVIEN, LOP

WHERE SINHVIEN.Malop=Lop.Malop AND TenLop= N'Công nghệ thông tin 60' AND

MaSV,TenSV,DiemThi(SINHVIEN MaSV=Diem MaSV  MONHOC MaMH=DIEM.MaMH  MONHOC.MaMH = 'Ti01' 

DiemThi >=7' (SINHVIEN x MONHOC x DIEM)) C2:

MaSV, HoTen, Diem (SINHVIEN * (Ơ DiemThi>=7 (DIEM ) * Ơ Ma MH=” Ti01 ”(DIEM))

SQL:

C1:

SELECT SINHVIEN.MaSV, TenSV, DiemThi

FROM SINHVIEN, MONHOC,DIEM

Trang 23

SELECT SINHVIEN.MaSV, TenSV, DiemThi, MaMH

FROM SINHVIEN Join DIEM on SINHVIEN.MaSV = Diem.MaSV

WHERE DiemThi >=7 AND MaMH in(SELECT MaMH

MaSV, count() (SINHVIEN) SQL:

SELECT COUNT(MaSV)

MaMH,TenMH(MONHOC * (DIEM * Que=’Hả i phòng'(SINHVIEN)) C3:

MaMH,TenMH(MaMH,TenMHMONHOC * (MaSV,MaMH(DIEM) * MaSV( Que=’Hả i phòng'

Trang 24

FROM MONHOC,SINHVIEN,DIEM

WHERE SINHVIEN.MaSV=DIEM.MaSV

AND MONHOC.MaMH=DIEM.MaMH

AND Que='Hai Phong' C2:

SELECT MaMH,TenMH

SELECT MONHOC.MaMH, TenMH

FROM MONHOC JOIN DIEM on MONHOC.MaMH = DIEM.MaMH

JOIN SINHVIEN on DIEM.MaSV = SINHVIEN.MaSV WHERE

Que ='Hai Phong'

Query2.6

Đưa ra danh sách các sinh viên học hai môn Ti01 và Hi01

ĐSQH:

C1:

MaSV,TenSV(SINHVIEN MaSV=Diem MaSV  MONHOC MaMH=DIEM.MaMH  (MaMH=’Ti01’  MaMH=’Hi01’)

(SINHVIEN x MONHOC x DIEM))

C2: MaSV,TenSV(SINHVIEN * (DIEM * (MaMH=’Ti01’  MaMH=’Hi01’(MONHOC))

C3: MaSV,TenSV(MaSV,TenSV(SINHVIEN) * (MaSV,MaMH(DIEM) * (MaMH(MaMH=’Ti01’ 

SQL:

C1

SELECTDISTINCT SINHVIEN.MaSV, TenSV

FROM SINHVIEN, MONHOC, DIEM

WHERE SINHVIEN.MaSV = DIEM.MaSV

AND MONHOC.MAMH = DIEM.MaMH

Trang 25

AND(MONHOC.MaMH='Ti01'OR MONHOC.MaMH='Hi01')

C2

SELECTDISTINCT SINHVIEN.MaSV, TenSV

FROM SINHVIEN JOIN DIEM on SINHVIEN.MaSV = DIEM.MaSV

join MONHOC on DIEM.MaMH=MONHOC.MaMH WHERE

MONHOC.MaMH='Ti01'OR MONHOC.MaMH='Hi01'

C3:

SELECTDISTINCT SINHVIEN.MaSV, TenSV

FROM SINHVIEN JOIN DIEM on SINHVIEN.MaSV = DIEM.MaSV

WHERE MaMH IN(SELECT MaMH

WHERE MaMH='Ti01'OR MaMH='Hi01') C4:

SELECT MaSV, TenSV

Trang 26

ĐÁP ÁN BÀI TẬP SỐ 10 - ONLINE

Câu hỏi 1

Cho CSDL QUANLYDIEM với lược đồ dữ liệu như sau

SINHVIEN(MaSV, HoTen, NgaySinh, GioiTinh, MaLop)

LOP(MaLop, TenLop)

MONHOC(MaMH, TenMH) DIEM(MaSV,

MaMH,DiemThi)

Yêu cầu:

1 Hãy dùng biểu thức đại số quan hệ tối ưu và câu lệnh SQL tối ưu để thực hiện các truy vấn

sau, chú ý tối ưu hóa câu lệnh (nộp trên Moodle phần này)

Q2.7 Đưa ra mã SV học cả hai môn có mã môn học là Ti01 và Hi01

MaSV(MaMH=’Ti01’ (DIEM))  MaSV(MaMH=’Hi01’(DIEM))

Trang 27

SELECT MaSV

FROM DIEM

WHERE MaMH IN (SELECT MaMH

FROM MONHOC

WHERE TenMH='Tin hoc ung dung')

Query2.9- MaSV và ten SV học cả hai môn Tin hoc dai cuong và Tin hoc ung dung

SELECT MaSV, TenSV

WHERE TenMH='Tin hoc ung dung'))

Query2.10- MaSV và ten SV có diem thi dươi 5

SELECT MaSV, TenSV

FROM SINHVIEN

WHERE MaSV IN (SELECT MaSV

FROM DIEM

WHERE DiemThi <5)

Q2.12 Đếm số SV học môn học có mã môn học là Ti01 và Hi01

SELECT COUNT(Distinct MaSV)

FROM DIEM

Trang 28

WHERE MaMH='Ti01' OR MaMH = 'Hi01'

Q2.12 Đếm số SV học môn học Tin học đại cương và tin học ứng dụng

SELECT COUNT(Distinct MaSV)

FROM DIEM

WHERE MaMH IN (SELECT MaMH

FROM MONHOC

WHERE TenMH='Tin hoc dai cuong' OR TenMH = 'Tin hoc ung dung')

2 Hãy tạo CSDL QUANLYDIEM trên một phần mềm SQL SERVER và thực hiện các truy vấn

trên (phần này để sẵn trên máy tính, khi nào online cô yêu cầu ai trình bày thì bạn đó sẽ trình

bày trực tiếp trên máy tính của mình)

Câu hỏi 2

Cho một CSDL về thư viện gồm các quan hệ sau đây:

SACH(TenSach, TacGia, TenNhaXB, MaSach)

NHAXB(TenNhaXB, DiaChiNhaXB, NoiXB)

DOCGIA(TenDocGia, DiaChiDG, ThanhPho, SoThe)

MUONSACH(SoThe, MaSach, NgayMuon)

Hãy tối ưu hóa biểu thức ĐSQH để thực hiện yêu cầu: “đưa ra một danh sách tên nhữngcuốn sách đã cho mượn tnrớc ngày 1/3/2020”

Giải

Bước 1: Biểu thức quan hệ trả lời câu hỏi “Hãy cho biết Tên khách hàng có số dư tài

khoản bằng 50000” có thể được viết như sau:

TenSach(ƠNgayMuon<1/3/1992(X(ơF(MUONSACH x DOCGIA x SACH)))) trong

đó

F = DOCGIA.SoThe = MUONSACH.SoThe  SACH.MaSach = MUONSACH.MaSach

X = {TenSach, TacGia, TenNhaXB, MaSach, TenDocGia, DiaChiDG, ThanhPho, SoThe,NgayMuon}

Biểu diễn dưới dạng cây:

Trang 29

Bước 2: Tách phép chọn ơF thành thành hai phép chọn với diều kiện:

SACH.MaSach = MUONSACH.MaSach và

DOCGIA.SoThe = MUONSACH.SoThe

Xét 3 phép chọn, tiến hành “đẩy” chúng xuống sâu nhất có thể

Phép chọn ơNgayMuon<1/3/2020 được đẩy xuống dưới phép chiếu và hai phép chọn kia nhờ quytắc L4 và L5 Phép chọn này áp dụng cho tích (MUONSACH x DOCGIA) x SACH Vì thuộctính NgayMuon trong phép chọn chỉ ở quan hệ MUONSACH nên có thể thay ơNgayMuon<1/3/2020((MUON x DOCGIA) x SACH) bằng biểu thức:

Trang 30

(ơNgayMuon<1/3/2020 (MUON x DOCGIA)) x SACH Và

cuối cùng là biểu thức:

((ơNgayMuon<1/3/2020 (MUON)) x DOCGIA) x SACH

Như vậy đã đẩy được phép chọn này xuống sâu nhất có thể

Bây giờ tiếp tục đẩy phép chọn với điều kiện SACH.MaSach = MUONSACH.MaSachxuống Không thể đẩy phép chọn này xuống dưới tích Đề-các vì nó liên quan tới thuộc tính củaquan hệ SACH và một thuộc tính lại không thuộc quan hệ SACH

Do vậy phép chọn với điều kiện:

DOCGIA.SoThe = MUONSACH.SoThe

Có thể đẩy xuống để áp dụng tích Đề_các: ơNgayMuon<1/3/2020

(MUONSACH) x DOCGIA

Bước 3: Áp dụng quy tắc với các phép chiều:

• Tổ hợp hai phép chiếu thành một phép chiếu là TenSach nhờ quy tắc L3 Kết quả được biểu diễntrên hình sau:

Trang 31

• Sau dó áp dụng quy tắc L5: σF(x(E)  x(σF (xy(E))) cho trường hợp tổng quát thay thế

TenSach(ƠSACH.MaSach = MUONSACH.MaSach(E)) Bởi dãy

TenSach(ƠSACH.MaSach = MUONSACH.MaSach(TenSach, SACH.MaSach,MUONSACH.MaSach(E))))

Ta có:

• Áp d ng quy t c L9 đ đ y phép chi u sau cùng xu ng dụ ắ ể ấ ể ố ưới tích Đ -các, ta có ề

TenSach, SACH.MaSach áp d ng cho quan h SACH và ụ ệ MUONSACH.MaSach áp d ng cho ụ

h ng th c bên trái c a tích Đ -các nh trong hình sau: ạ ứ ủ ề ư

Trang 32

• Ti p theo, l i áp d ng quy t c 5 cho trế ạ ụ ắ ường h p t ng quát đ i v i m i phép chi u và m tợ ổ ố ớ ỗ ế ộphép ch n đ có dãy: ọ ể

Phép chiếu sau cùng lại được đẩy xuống dưới tích Đề-các nhờ quy tắc 9

Phép chi u ế DOCGIA.SoThe đ y xu ng h ng th c DOCGIA vì thu c tính chi u là thu c tính ẩ ố ạ ứ ộ ế ộ

c a quan h này ủ ệ

Phép chiếu thứ hai MUON.MaSach, MUONSACH.SoThe đẩy xuống hạng thức MUONSACH Cácthuộc tính không phù hợp bị loại bỏ Biểu diễn cây cuối cùng của biểu thức được mô tả ở hìnhsau:

Trang 33

Cuối cùng, ta áp dụng chiến lược tối ưu thứ hai, tổ hợp các phép chọn xác định với phéptích Đề - Các thành phép kết nối

Ngày đăng: 16/08/2022, 15:48

w