If you're seeing this message, it means we're having trouble loading external resources on our website.

Nếu bạn đang sử dụng bộ lọc web, vui lòng kiểm tra lại xem bộ lọc có chặn hai tên miền *.kastatic.org*.kasandbox.org hay không.

Nội dung chính

Chia dữ liệu vào các bảng liên quan

Tính đến nay, trong các lần thực hành SQL, chúng ta chỉ mới làm việc với một bảng tại một thời điểm và xem xét các dữ liệu mà ta có thể chọn từ bảng đó. Nhưng trên thực tế, trong hầu hết các trường hợp, dữ liệu phân bố trong nhiều bảng và các bảng này nhìn chung đều có "liên quan" với nhau.
Ví dụ, ta có một bảng ghi lại điểm thi của sinh viên và địa chỉ email trong trường hợp cần thông báo đến phụ huynh nếu điểm số có xu hướng giảm:
student_namestudent_emailtestgrade
Peter Rabbitpeter@rabbit.comNutrition95
Alice Wonderlandalice@wonderland.comNutrition92
Peter Rabbitpeter@rabbit.comChemistry85
Alice Wonderlandalice@wonderland.comChemistry95
Ta có thêm một bảng ghi lại những tựa sách mà mỗi sinh viên đọc:
student_namebook_titlebook_author
Peter RabbitThe Tale of Mrs. Tiggy-WinkleBeatrix Potter
Peter RabbitJabberwockyLewis Carroll
Alice WonderlandThe Hunting of the SnarkLewis Carroll
Alice WonderlandJabberwockyLewis Carroll
Và một bảng khác ghi lại thông tin chi tiết của sinh viên:
idstudent_firststudent_laststudent_emailphonebirthday
1PeterRabbitpeter@rabbit.com555-66662001-05-10
2AliceWonderlandalice@wonderland.com555-44442001-04-02
Bạn nghĩ sao về các bảng trên? Bạn có muốn thay đổi gì không?
Có một điểm quan trọng cần lưu ý về các bảng đã cho, đó là chúng đang mô tả những dữ liệu có mối liên quan với nhau. Như bạn có thể thấy, mỗi bảng mô tả một thông tin liên quan đến sinh viên và một vài bảng cung cấp cùng một thông tin. Khi thông tin xuất hiện trong nhiều bảng, sẽ có một vài vấn đề phát sinh.
Ví dụ, nếu một sinh viên đổi địa chỉ email, chúng ta cần thay đổi bảng nào?
Trong trường hợp này, chúng ta cần thay đổi bảng thông tin của sinh viên. Tuy nhiên, vì thông tin về địa chỉ email của sinh viên cũng có trong bảng điểm thi nên ta cần phải tìm tất cả các hàng chứa dữ liệu về sinh viên đó và chỉnh sửa địa chỉ email.
Thông thường, bạn nên đảm bảo rằng dữ liệu về một thông tin cụ thể chỉ được lưu trữ ở một vị trí duy nhất. Như vậy sẽ có ít bảng cần cập nhật hơn và giảm thiểu rủi ro có thể xảy ra khi cùng một loại dữ liệu được lưu ở nhiều bảng khác nhau. Khi lưu trữ dữ liệu ở một vị trí duy nhất, chúng ta cần đảm bảo rằng có cách liên kết dữ liệu giữa các bảng. Chúng ta sẽ đề cập đến phần này sau.
Giả sử chúng ta quyết định bỏ thông tin về địa chỉ email khỏi bảng điểm thi vì bị trùng lặp với thông tin về địa chỉ email trong bảng thông tin của sinh viên. Ta được kết quả là bảng sau:
student_nametestgrade
Peter RabbitNutrition95
Alice WonderlandNutrition92
Peter RabbitChemistry85
Alice WonderlandChemistry95
Vậy thì chúng ta sẽ xác định địa chỉ email của mỗi sinh viên bằng cách nào? Chúng ta có thể dựa vào họ tên để tìm trong bảng thông tin sinh viên. Nhưng nếu có 2 học sinh bị trùng tên, ta sẽ không thể tra cứu dữ liệu của sinh viên đó nếu chỉ có một thông tin như vậy. Trên thực tế, chúng ta không bao giờ nên dựa vào những thông tin như tên để xác định dữ liệu độc nhất trong một bảng.
Phương án tốt nhất trong trường hợp này là bỏ cột student_name (họ tên sinh viên) và thay thế bằng student_id (mã sinh viên). Lí do là vì ta có thể đảm bảo chắc chắn rằng mỗi sinh viên có riêng một mã:
student_idtestgrade
1Nutrition95
2Nutrition92
1Chemistry85
2Chemistry95
Ta cũng cần thực hiện thay đổi tương tự đối với bảng ghi những tựa sách mà mỗi sinh viên đọc, đó là đổi cột student_name thành student_id:
student_idbook_titlebook_author
1The Tale of Mrs. Tiggy-WinkleBeatrix Potter
1JabberwockyLewis Carroll
2The Hunting of the SnarkLewis Carroll
2JabberwockyLewis Carroll
Bạn có nhận thấy tiêu đề cuốn sách Jabberwocky và tên tác giả của cuốn sách đó lặp lại hai lần trong bảng không? Đây là dấu hiệu cho thấy chúng ta có thể tách bảng này thành nhiều bảng liên quan để không phải để ý cập nhật nhiều vị trí nếu thông tin về cuốn sách thay đổi.
Ta có thể lập một bảng chỉ ghi dữ liệu về những tựa sách có xuất hiện:
idbook_titlebook_author
1The Tale of Mrs. Tiggy-WinkleBeatrix Potter
2JabberwockyLewis Carroll
3The Hunting of the SnarkLewis Carroll
Như vậy, bảng student_books (những tựa sách mà sinh viên đọc) sẽ trở thành như sau:
student_idbook_id
11
12
23
22
Bạn có thể nhận xét rằng, bảng mới không dễ đọc như bảng cũ với đầy đủ thông tin được ghi ở mỗi hàng. Tuy nhiên, các bảng dữ liệu thường không được thiết kế với mục đích để con người đọc. Chúng được thiết kế sao cho dữ liệu được lưu trữ và cập nhật dễ dàng nhất có thể, hạn chế tối đa rủi ro gặp lỗi. Trong nhiều trường hợp, chúng ta nên chia thông tin vào nhiều bảng liên quan để giảm thiểu dữ liệu dư thừa cũng như số lượng bảng cần cập nhật khi có thay đổi.
Điều quan trọng là chúng ta phải sử dụng thành thạo SQL để xử lý dữ liệu đã được chia thành nhiều bảng liên quan cũng như tập hợp dữ liệu trên các bảng khi cần thiết. Ta có thể thực hiện các nhiệm vụ này bằng cách sử dụng một khái niệm được gọi là "kết hợp" mà bạn sẽ học trong bài tiếp theo.

Tham gia cuộc thảo luận?

Chưa có bài đăng nào.
Bạn có hiểu Tiếng Anh không? Bấm vào đây để thấy thêm các thảo luận trên trang Khan Academy Tiếng Anh.