Hướng dẫn bài tập thiết kế cơ sở dữ liệu
Bài tập thực hành SQL sau đây để các bạn có thể nắm vững cú pháp hơn. Các bạn nên thử tự xây dựng các bảng trước khi xem lời giải để đảm bảo học tốt hơn.
Xin chào các bạn mình là Phạm Vũ – Học viên FUNiX. Sau khi học xong bài hướng dẫn về cách thao tác với bảng và Ràng buộc khóa chính, khóa ngoại trong sql thì mình có bài tập thực hành SQL sau đây để các bạn có thể nắm vững cú pháp hơn. Các bạn nên thử tự xây dựng các bảng trước khi xem lời giải để đảm bảo học tốt hơn nhé! Show
1. Phần 1: Nội dung bài tập thực hành sqlHãy viết các câu lệnh SQL để tạo CSDL có tên QLBanhang gồm 4 bảng có cấu trúc như sau: Những thuộc tính gạch chân là khóa chính (primary key) của bảng. 1.1 Bảng KHACHHANG Tên cột Kiểu dữ liệu Kích thướcMAKHNvarchar 5 TENKH Nvarchar 30 DIACHI Nvarchar 300 DT Varchar 10 EMAIL Varchar 30 1.2 Bảng VATTU Tên cột Kiểu dữ liệu Kích thướcMAVTNvarchar 5 TENVT Nvarchar 30 DVT Nvarchar 20 GIAMUA money SLTON int 1.3 Bảng HOADON Tên cột Kiểu dữ liệu Kích thướcMAHDNvarchar 10 NGAY Datetime MAKH Nvarchar 5 TONGTG money 1.4 Bảng CHITIETHOADON Tên cột Kiểu dữ liệu Kích thướcMAHDNvarchar 10MAVTNvarchar 5 SL int GIABAN money Thời gian làm bài dự kiến: 30 phút \>>> Xem thêm: Cách sao lưu và khôi phục cơ sở dữ liệu Microsoft SQL Server bằng SSMS 2. Phần 2: Thực hành với hệ quản trị cơ sở dữ liệu SQL Server2.1 Bước 1: Tạo database QLBanHangCREATE DATABASE QLBANHANG; 2.2 Bước 2: Tạo bảng KHACHHANGCú pháp: use QLBanHang CREATE TABLE KHACHHANG( MAKH nvarchar(5) NOT NULL PRIMARY KEY, TENKH nvarchar(30), DIACHI nvarchar(300), DT varchar(10), EMAIL varchar(30) ); Kết quả: 2.3 Bước 3: Tạo bảng VATTUCú pháp: CREATE TABLE VATTU( MAVT nvarchar(5) NOT NULL PRIMARY KEY, TENVT nvarchar(30), DVT nvarchar(20), GIAMUA money, SLTON int ); Kết quả: 2.4 Bước 4: Tạo bảng HOADONCú pháp: CREATE TABLE HOADON( MAHD nvarchar(10) NOT NULL PRIMARY KEY, NGAY datetime, MAKH nvarchar(5), TONGTG money ); Kết quả: 2.5 Bước 5: Tạo bảng CHITIETHOADONCú pháp: CREATE TABLE CHITIETHOADON( MAHD nvarchar(10) NOT NULL, MAVT nvarchar(5) NOT NULL, SL int, GIABAN money CONSTRAINT PK_ChiTietHoaDon PRIMARY KEY(MAHD,MAVT) ); Kết quả: \>>> Xem thêm: Các lệnh cơ bản thao tác với SQL 3. Phần 3: Kết luậnSau khi hoàn thành xong bài thực này này, bạn đã có thể nắm vững cú pháp tạo Database, tạo bảng với khóa chính và các cột với các kiểu dữ liệu khác nhau như int, nvarchar, varchar, datetime, money. Hy vọng bài viết này hữu ích với bạn, nếu có góp ý nào vui lòng liên hệ tới email: [email protected]. Thiết kế cơ sở dữ liệu là công việc vô cùng quan trọng trong các dự án, nếu thiết kế đúng CSDL sẽ giúp việc triển khai dự án thuận lợi và tiết kiệm. Tuy nhiên, rất nhiều bạn khi mới vào nghề thường gặp khó khăn về vấn đề thiết kế cơ sở dữ liệu như:
Bài này chúng ta sẽ bàn về những vấn đề đó. Thiết kế cấu trúc cơ sở dữ liệuThiết kế cấu trúc cơ sở dữ liệu là quá trình mô hình hóa nhằm chuyển đổi các đối tượng từ thế giới thực (Real-world system) sang các bảng trong hệ thống cơ sở dữ liệu (Database system) đáp ứng các yêu cầu lưu trữ và khai thác dữ liệu. Mô hình hóa việc thiết kế cấu trúc cơ sở dữ liệu Trong đó,
Để thực hiện việc thiết kế cơ sở dữ liệu chúng ta cần thực hiện các bước sau đây:
Thực hành thiết kế Cơ sở dữ liệuĐể các bạn dễ hiểu quá trình thiết kế cơ sở dữ liệu, chúng ta sẽ thực hành thiết kế cấu trúc cơ sở dữ liệu cho hệ thống quản lý đơn hàng có mẫu hóa đơn như sau: Bước 1: Xác định các thành phần dữ liệuĐể xác định các thành phần dữ liệu chúng ta cần thực hiện các bước sau đây:
Ở bài toán trên, chúng ta thu thập được dữ liệu quan trọng là mẫu hóa đơn của đơn vị đang áp dụng, chúng ta sẽ phân tích nó để định nghĩa các thành phần dữ liệu. Khảo sát hóa đơn trên chúng ta thu được các thành phần dữ liệu sau đây: InvoiceNo: Số hóa đơn InvoiceDate: Ngày ghi hóa đơn CustomerName: Tên khách hàng CustomerCompany: Tên công ty khách hành CustomerAddress: Địa chỉ khách hàng CustomerAccountNo: Số tài khoản của khách hàng PaymentMethod: Phương thức thanh toán CustomerTaxNo: Mã số thuế của khách hàng SequenceNo: Số thứ tự mua hành ProductName: Tên sản phẩm Unit: Đơn vị tính của sản phẩm Quantity: Số lượng UnitPrice: Đơn giá Amount: Thành tiền TotalAmount: Tổng tiền VAT: Thuế giá trị gia tăng TotalPay: Tổng tiền phải trả ByText: Ghi bằng chữ Lưu ý: Vì tiếng việt có dấu dễ gây lỗi khi code, nếu dùng không dấu thì dễ gây nhầm lẫn nên tôi khuyên các bạn nên đặt tên các thành phần dữ liệu theo tiếng Anh vừa tránh được các lỗi trên vừa giúp bạn dễ dàng tham gia các dự án quốc tế sau này. Loại bỏ các dữ liệu trùng ở các dạng sau:
Xem xét danh sách các thành phần ở trên chúng ta loại các trường sau: Amount: Thành phần này được tính từ đơn giá * số lượng TotalAmount: Thành phần này được tính bằng tổng các mục thành tiền. TotalPay: Thành phần này được tính bằng TotalAmount – VAT amount ByText: Được đọc từ tổng tiền phải trả. Các thành phần không cần như thông tin đơn vị bán, chữ ký người mua, chữ ký kế toán… Có nhưng thực sự bạn không cần lưu cùng đơn hàng vào cơ sở dữ liệu. Bước 2: Chia nhỏ các thành phần dữ liệu thành đơn vị nhỏ nhất hữu dụngĐể hiểu phần này bạn xem xét ví dụ sau: CustomerName có giá trị là Nguyễn Văn A, trường này có thể tách ra là Lastname (Nguyễn), Middlename (Văn) và Firstname (A). Tuy nhiên, có hệ thống thì lưu hết vào một trường là ‘Nguyễn Văn A’ như giao hàng chẳng hạn, có hệ thống chia ra là ‘Nguyễn Văn’, ‘A’ như hệ thống quản lý sinh viên, có hệ thống chia ra thành ‘Nguyễn’, ‘Văn’, ‘A’ như hệ thống quản lý bay… Do vậy, bạn cần xem xét hệ thống bạn đang xây dựng sẽ lưu như thế nào. Trong hệ thống này do hay sắp xếp theo tên khách hàng nên chúng ta tách nó ra thành 02 phần là CustomerLastName và CustomerFirstName. Tương tự trường CustomerAddress cung vậy, để quản lý theo tỉnh/thành phố và quận/huyện chúng ta chia nó ra thành 03 trường như sau: CustomerAddress, CustomerDistrict và CustomerCity. Bạn hãy xem xét các trường còn lại xem có phải tách trường nào ra nữa hay không. Sau khi tách các trường cần thiết và loại bỏ các trường không cần thiết ta có các thành phần dữ liệu như sau: InvoiceNo: Số hóa đơn InvoiceDate: Ngày ghi hóa đơn CustomerFirstName: Tên khách hàng CustomerLastName: Họ và tên lót của khách hàng CustomerCompany: Tên công ty khách hành CustomerAddress: Địa chỉ khách hàng CustomerCity: Thành phố khách hàng đang ở CustomerDistrict: Quận khách hàng đang ở CustomerAccountNo: Số tài khoản của khách hàng PaymentMethod: Phương thức thanh toán CustomerTaxNo: Mã số thuế của khách hàng SequenceNo: Số thứ tự mua hành ProductName: Tên sản phẩm Unit: Đơn vị tính của sản phẩm Quantity: Số lượng UnitPrice: Đơn giá Amount: Thành tiền VAT: Thuế giá trị gia tăng Bước 3: Xác định các bảng và các cột cho cơ sở dữ liệuThực hiện theo các bước sau:
Chúng ta bàn về thực thể, thực thể là người, là vật tồn tại trong hệ thống đang xem xét. Đối với thiết kế Cơ sở dữ liệu chúng ta chỉ quan tâm đến các thực thể mang thông tin. Xem xét danh sách các thành phần dữ liệu từ trên xuống chúng ta có thể liệt kê ra các thực thể thấy được như sau:
Có thể bạn sẽ thấy khó hiểu chỗ này, bạn cần suy nghĩ kỹ để hiểu lý do vì sao chọn được 03 thực thể trên. 1.Tiếp theo chúng ta nhóm các thành phần dữ liệu tương ứng vào các thực thể 2. Kiểm tra các trường thừa/thiếu
Bước 4: Xác định khóa chính, khóa ngoại và mối quan hệ giữa các thực thể
a. Xác định khóa chính cho các thực thểKhái niệm về khóa chính các bạn xem ở bài Cơ bản về cơ sở dữ liệu. Trong phần này chúng ta bàn về cách xác định khóa chính cho thực thể. Khóa chính của thực thể có thể xác định như sau:
Lúc này chúng ta có các thực thể như sau: b. Xác định mối quan hệ giữa các bảngXem xét các thực thể bạn có để xác định các định mối quan hệ của chúng, chúng ta có các thực thể Customer, Product và Invoice thì mối quan hệ của chúng chỉ có thể là Customer mua Product và sinh ra Invoice để ghi nhận thông tin. Mối quan hệ trong thế giới thực của các thực thể. Chuyển sang mô hình thực thể nó được biểu diễn như sau: Xác định loại quan hệ giữa các thực thể như sau:
c. Phân tách các quan hệ để đưa về mô hình nhị nguyênTheo mô hình cơ sở dữ liệu quan hệ nếu bạn để tồn tại mối quan hệ n-n nó sẽ gây ra dư thừa dữ liệu (xem bài vấn đề dư thừa dữ liệu). Do vậy, bạn cần tách quan hệ ra thành các quan hệ 1-n bằng cách thêm vào bảng dữ liệu mới. Trong ví dụ trên chúng ta thêm vào bảng InvoiceDetails để tách nó ra thành 02 quan hệ 1-n như sau: Ở đây bạn sẽ khó hiểu là tách trường nào cho bảng InvoiceDetails, dựa vào đâu. Việc này sẽ được giải thích rõ trong bài chuẩn hóa cơ sở dữ liệu bạn xem thêm nhé. d. Bổ sung khóa ngoại cho các mối quan hệKhi đã xác định xong các mối quan hệ, bạn cần đặt các khóa ngoại vào các bảng bên n trong quan hệ 1-n để tạo liên kết giữa chúng. Lúc này chúng ta có cấu trúc cơ sở dữ liệu như sau: Bước 5: Chuẩn hóa cơ sở dữ liệuBước này giúp bạn xem lại cơ sở dữ liệu vừa thiết kế có đáp ứng được qui định của cơ sở dữ liệu quan hệ hay không. Tuy nhiên, đây là một chủ đề dài nên tôi sẽ tách ra thành một bài riêng, bạn đọc thêm ở bài Chuẩn hóa cơ sở dữ liệu nhé. Làm thế nào để biết được cơ sở dữ liệu được thiết kế đúng? Bạn chỉ có thể kết luận cơ sở dữ liệu được thiết kế đúng khi các chức năng của hệ thống cài đặt thành công trên nó. Do vậy, bạn có thể chạy thử (dry run) các chức năng trên cấu trúc cơ sở dữ liệu để kiểm tra thiết kế của nó có phù hợp hay không. Kết luậnThiết kế cơ sở dữ liệu là một chủ đề khó, liên quan đến nhiều chủ đề nên bạn cần đọc kỹ và đọc các bài liên quan của chuỗi bài viết này để hiểu rõ hơn về nó. Ngoài ra, bạn cũng cần thực tập thiết kế nhiều cơ sở dữ để có kinh nghiệm thiết kế tốt hơn. Bài tiếp: Chuẩn hóa cơ sở dữ liệu Bài trước: Cơ sở dữ liệu là gì? Cơ sở dữ liệu quan hệ là gì? Nếu bạn có điều gì chưa rõ hoặc thắc mắc bạn có thể để lại bình luận bên dưới tôi sẽ sẵn sàng trao đổi với bạn. |