Relation Database Ruby on Rails
Tôi chủ yếu làm việc với ngôn ngữ Android, để thử sức với Ruby on Rails tôi tìm hiểu về đặc khác biệt của Ruby on Rails so với Java. Có khá nhiều thứ, mức độ sâu rộng của database là một điểm căn bản lớn trong đó. Do vậy tôi đọc về database trong Rails và tìm thấy một chủ đề khá thú vị là Relation ...
Tôi chủ yếu làm việc với ngôn ngữ Android, để thử sức với Ruby on Rails tôi tìm hiểu về đặc khác biệt của Ruby on Rails so với Java. Có khá nhiều thứ, mức độ sâu rộng của database là một điểm căn bản lớn trong đó. Do vậy tôi đọc về database trong Rails và tìm thấy một chủ đề khá thú vị là Relation Database.
Chúng ta có rất nhiều cơ sở dữ liệu khác nhau: từ nhỏ và hữu ích như SQLite đến loại lớn mạnh như Teradata. Nhưng chúng ta có rất ít bài viết giải thích "database làm việc như thế nào?". Bạn có thể search google "how does a relational database work" và xem kết quả ít như thế nào. Hơn nữa, những bài viết đó đều rất ngắn. Bây giờ bạn hãy nhìn vào các công nghệ mới nhất hiện nay (như là Big Data, NoSQL hoặc JavaScript), bạn có thể tìm thấy rất nhiều bài viết giải thích các mà họ đã làm việc như thế nào.
Cơ sở dữ liệu rất là thú vị, bởi vì nó dựa trên các khái niệm hữu ích (useful) và tái sử dụng (reusable). Trước tiên bạn phải có một chút hiểu biết về database, làm sao để viết một số lệnh query nối bảng đơn giản, hoặc CRUD query đơn giản, nếu không có thể bạn sẽ không hiểu được bài viết này.
Bài viết sẽ bắt đầu với một số các khái niệm liên quan đến khoa học máy tính, như độ phức tạp, ... Có thể bạn sẽ không thích chủ đề đó, nhưng mà không có nó, bạn sẽ không hiểu được sự thông minh bên trong một cơ sở dữ liệu. Vì nó là một chủ đề lớn, nên ở đây bài viết chỉ tập chung vào những gì tôi nghĩ nó là quan trọng, cần thiết: Cách một cơ sở dữ liệu xử lý truy vấn SQL.
Đầu tiên hãy quay về vấn đề cơ bản(một số các khái niệm về độ phức tạp của thuật toán).
Từ thời xa xưa khi con người bắt đầu biết lập trình, các developers đã biết chính xác số lượng operations mà họ coding. Vì họ không muốn lãng phí tài nguyên CPU và memory, lúc đó máy tính rất chậm, và có cấu hình rất thấp. Trong phần này sẽ giới nhắc lại một số khái niệm và cần thiết để hiểu một database. Nó cũng sẽ giới thiệu một số khái niệm về "database index".
O(1) vs O(n^2) Ngày nay, rất nhiều developers không quan tâm đến độ phức tạp về thời gian truy vấn... và họ đúng.
Nhưng khi bạn đối mặt với một lượng dữ liệu lớn(không phải hàng ngàn mà là hàng triệu bản ghi) hoặc là bạn đang đối mặt với việc query trong thời gian rất ngắn được tính bằng mili giây thì việc hiểu khái niệm này trở nên rất quan trọng. Hoặc đôi khi databases của bạn phải đối mặt với cả hai vấn đề trên. Dưới đây sẽ đi cụ thể về khái niệm này:
Độ phức tạp (The time complexity) được sử dụng để xem trong thời gian bao lâu một thuật toán trả về một lượng dữ liệu. Để mô tả độ phức tạp, khoa học máy tính sử dụng kí hiệu toán học O. Kí hiệu này được được sử dụng với một hàm(function) bên trong nó mô tả có bao nhiêu operations trong một tuần toán cần để lấy được một lượng data nhất định.
Ví dụ: Khi nói thuật toán này là O(function_nào_đó()), nó có nghĩa là để lấy được lượng data cần thiết thì thuật toán đang dùng cần phải thực thi function_nào_đó() operations.
Khi mà lượng dữ liệu tăng lên thì số lượng operations cũng tăng lên một cách nhanh chóng. Bạn có thể xem biểu đồ dưới để thấy được sự thay đổi đáng kể khi lượng data tăng lên.
Với lượng data nhỏ, sự khác nhau giữa O(1) và O(n^2) là không đáng kể. Ta xét ví dụ sau với một thuật toán cần xử lý với 2000 phần tử(elements)
Với thuật toán có độ phức tạp O(1) sẽ tốn của bạn 1 operation Thuật toán có độ phức tạp O(log(n)) sẽ tốn của bạn 7 operations Thuật toán có độ phức tạp O(n) sẽ tốn của bạn 2000 operations Thuật toán có độ phức tạp O(n*log(n)) sẽ tốn của bạn 14 000 operations Thuật toán có độ phức tạp O(n^2) sẽ tốn của bạn 4 000 000 operations Nhìn vào đó có thể thấy được sự khác nhau giữa O(1) và O(n^2) vào khoảng 4 triệu operations nhưng mà bạn chỉ mất khoảng 2ms, nó là thời gian không đáng kể chỉ như một cái chớp mắt của bạn. Hiện nay, bộ vi xử lý có thể xử lý hàng trăm triệu phép tính mỗi giây. Đó chính là lý do vì sao hiệu suất và tối ưu hóa không phải là một vấn đề trong nhiều dự án công nghệ thông tin. Như đã nói ở trên thì khi lượng data tăng lên thì vấn đề này vẫn rất quan trọng để biết. Chúng ta sẽ thử nghiệm với lượng data lớn hơn khoảng 1 000 000 phần tử(elements)(đây cũng chưa phải là một big data).
Với thuật toán có độ phức tạp O(1) sẽ tốn của bạn 1 operation Thuật toán có độ phức tạp O(log(n)) sẽ tốn của bạn 14 operations Thuật toán có độ phức tạp O(n) sẽ tốn của bạn 1 000 000 operations Thuật toán có độ phức tạp O(n*log(n)) sẽ tốn của bạn 14 000 000 operations Thuật toán có độ phức tạp O(n^2) sẽ tốn của bạn 1 000 000 000 000 operations Không cần phải thực hiện các phép tính toán học bạn cũng có thể thấy rằng thuật toán với với độ phức tạp O(n^2) bạn có đủ thời gian để uống một ly cafe hoặc thậm chí là 2 tách. Nếu bạn thêm một số 0 vào lượng data xử lý thì bạn có thể có một giấc ngủ