Nội dung chính
Khóa học: Lập trình bằng JavaScript - Lập trình web > Chương 3
Bài học 3: Truy vấn dữ liệu liên quan bằng SQL- Chia dữ liệu vào các bảng liên quan
- Kết hợp hai bảng có dữ liệu liên quan
- Thử thách: Sở thích của Bobby
- Kết hợp dữ liệu hai bảng bằng LEFT OUTER JOIN
- Thử thách: Đơn đặt hàng của khách hàng
- Kết hợp dữ liệu một bảng với chính bảng đó
- Thử thách: Các ngôn ngữ truy vấn trong SQL
- Phối hợp nhiều cách kết hợp dữ liệu bảng
- Thử thách: Danh sách bạn bè
- Dự án: Người nổi tiếng
- Cải thiện hiệu năng truy vấn SQL bằng cách lập kế hoạch thực thi và tối ưu hóa
© 2024 Khan AcademyĐiều khoản sử dụngChính sách về quyền riêng tưThông báo về cookie
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_name | student_email | test | grade |
---|---|---|---|
Peter Rabbit | peter@rabbit.com | Nutrition | 95 |
Alice Wonderland | alice@wonderland.com | Nutrition | 92 |
Peter Rabbit | peter@rabbit.com | Chemistry | 85 |
Alice Wonderland | alice@wonderland.com | Chemistry | 95 |
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_name | book_title | book_author |
---|---|---|
Peter Rabbit | The Tale of Mrs. Tiggy-Winkle | Beatrix Potter |
Peter Rabbit | Jabberwocky | Lewis Carroll |
Alice Wonderland | The Hunting of the Snark | Lewis Carroll |
Alice Wonderland | Jabberwocky | Lewis Carroll |
Và một bảng khác ghi lại thông tin chi tiết của sinh viên:
id | student_first | student_last | student_email | phone | birthday |
---|---|---|---|---|---|
1 | Peter | Rabbit | peter@rabbit.com | 555-6666 | 2001-05-10 |
2 | Alice | Wonderland | alice@wonderland.com | 555-4444 | 2001-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_name | test | grade |
---|---|---|
Peter Rabbit | Nutrition | 95 |
Alice Wonderland | Nutrition | 92 |
Peter Rabbit | Chemistry | 85 |
Alice Wonderland | Chemistry | 95 |
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_id | test | grade |
---|---|---|
1 | Nutrition | 95 |
2 | Nutrition | 92 |
1 | Chemistry | 85 |
2 | Chemistry | 95 |
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_id | book_title | book_author |
---|---|---|
1 | The Tale of Mrs. Tiggy-Winkle | Beatrix Potter |
1 | Jabberwocky | Lewis Carroll |
2 | The Hunting of the Snark | Lewis Carroll |
2 | Jabberwocky | Lewis 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:
id | book_title | book_author |
---|---|---|
1 | The Tale of Mrs. Tiggy-Winkle | Beatrix Potter |
2 | Jabberwocky | Lewis Carroll |
3 | The Hunting of the Snark | Lewis 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_id | book_id |
---|---|
1 | 1 |
1 | 2 |
2 | 3 |
2 | 2 |
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.