Sự khác nhau giữa hệ thống OLAP và OLTP?


Có 2 loại ứng dụng cơ sở dữ liệu trong việc phát triển ứng dụng mà chúng ta cần biết. Bài viết này sẽ nói cho bạn biết sự giống và khác nhau giữa 2 loại hệ thống này.

Đầu tiên, cả OLTP (on-line transactional processing) và OLAP (on-line analytical processing) đều được dùng trong các hệ thống nghiệp vụ, đặc biệt là trong các kho dữ liệu (data warehousing) và phân tích. Chúng tạo nên hai mặt khác nhau là phân tích, lưu trữ dữ liệu và lưu trữ và thao tác dữ liệu.

Thâm nhập vào thế giới cơ sở dữ liệu, điều quan trọng là bạn cần hiểu biết rõ ràng sự khác nhau giữa các loại của cơ sở dữ liệu được sử dụng. Không quan trọng bạn đi theo hướng nào, hiểu cơ bản về sự khác nhau giữa OLAPOLTP sẽ giúp bạn có hiểu biết tốt hơn. Trong bài viết này tôi sẽ giải thích mỗi loại hệ thống làm gì và làm sao để sử dụng mỗi loại.

OLTP là gì?

OLTP viết tắt từ On-line transactional processing có nghĩa là xử lý giao dịch trực tuyến, nghe thì ghê vậy nhưng khái niệm không khó để nắm bắt. Các hệ thống OLTP là các hệ thống cổ điển chúng xử lý dữ liệu giao dịch. Chúng ở quanh ta. Trong ngân hàng, ATM hoặc hệ thống máy tính xử dụng bởi giao dịch viên đều lưu các giao dịch đều là một hệ thống OLTP thường là sử dụng 1 cơ sở dữ liệu. Nếu bạn nhắn cho ai đó từ smartphone tức là bạn đang làm việc trên một hệ thống OLTP khác. Máy tính tiền ở siêu thị gần nhà bạn cũng chạy sang một hệ thống OLTP khác….

Nói ngắn gọn, hầu hết các ứng dụng nghiệp vụ kinh doanh đều là OLTP. Thật khó để tưởng tượng về kỹ thuật máy tính nếu không có một vài hệ thống của OLTP. Thật vậy, toàn bộ ngành khoa học máy tính được phát triển xung quanh việc quản lý các giao dịch có trật tự.

Chúng ta xét từ một phần rất quan trọng trong thuật ngữ OLTP: chữ T, được viết tắt từ transactional. Các giao dịch rất quan trọng và giữ cho chúng được tổ chức càng quan trọng.

Điều gì giúp các giao dịch được tổ chức? Nghĩa là các cơ sở dữ liệu giao dịch phải ổn định (hoặc liên tục, không dễ gì thay đổi), độc lập, đồng nhất và nguyên tử (Atomic, Consistent, Isolated và Durable - ACID). Giải thích chúng thì lại ngoài phạm vi bài viết các bạn có thể Google với từ khóa “Các tính chất ACID của cơ sở dữ liệu”.

Nói đơn giản là loại transaction này đảm bảo các hoạt động được thực hiện bởi các người dùng khác nhau không ảnh hưởng gì đến nhau. Ví dụ, nếu người chồng và người vợ mỗi người thực hiện một thao tác rút tiền từ một tài khoản chung, tính nguyên tử (atomic) của transaction sẽ đảm bảo họ không rút nhiều hơn số tiền có trong tài khoản.

Một hệ thống OLTP cần đảm bảo rằng tất cả làm việc theo trật tự. Khi bạn vô ngân hàng bạn tự tin rằng tiền của mình sẽ được gửi đúng tài khoản của bạn không bị lẫn với giao dịch hay tài khoản khác hoặc bị mất.

Vậy là bạn đã rõ, việc xử lý giao dịch rất quan trọng cho xã hội chúng ta. Thế còn OLAP thì sao?

OLAP là gì?

OLAP là từ viết tắt của on-line analytical processing dịch là xử lý phân tích trực tuyến, cũng là điều nói cho chúng ta biết hệ thống OLAP làm gì. Một hệ thống OLAP phân tích dữ liệu hiệu quả.

Không giống OLTP, hệ thống OLAP làm việc với lượng rất lớn dữ liệu. Vậy nên độ ưu tiên cho tính chính xác và tính toàn vẹn của giao dịch không đặt cao như OLTP. OLAP cho phép bạn tìm ra xu hướng, các con số khủng hoảng và giúp chúng ta nhìn ra bức tranh lớn. Các hệ thống này có một nhóm nhỏ các người dùng hơn OLTP. Ví dụ bạn sẽ không tương tác với hệ thống OLAP của ngân hàng vì nó không liên quan đến hệ thống ghi giao dịch của tài khoản bạn.

Một hệ thống dự báo OLAP thường xử dụng một tập dữ liệu lớn, sự tương tác kéo dài hơn. Và có nhiều tình huống nơi chúng ta sẽ không biết sự tương tác đó là gì và trông như thế nào. Một vài câu lệnh truy vấn nhỏ nhưng đa số thường có kích thước khá lớn và tốn nhiều thời gian thực thi. Ngược lại, OLTP thường sử dụng các câu lệnh phổ biến như INSERT và DELETE, chúng ta có một ý tưởng tốt và kết quả là một câu lệnh hoàn thành và không tốn time gì cả.

Kích thước của hệ thống cũng giúp phân biệt vai trò giữa OLTP và OLAP. OLTP phải ổn định và nhanh (để phục vụ các tác vụ ngay lập tức) trong khi OLAP phải đủ lớn và mạnh mẽ để phân tích tất cả các dữ liệu kinh doanh.

OLTP và OLAP

Hãy phân tích sự khác nhau giữa OLAP và OLTP trong ví dụ thực tế:

Ví dụ về một ứng dụng OLTP trong thực tế

Nhớ rằng, các truy vấn OLTP phải đơn giản nhất có thể và nhỏ hơn hệ thống OLAP. Chúng ta cần thực thi các truy vấn OLTP nhanh và cho một lượng dữ liệu nhỏ. Ví dụ chúng ta nhìn vào một hệ thống thanh toán tài chính.

Chúng ta có thể thấy một vài bảng cơ bản chứa dữ liệu khách hàng, hợp đồng, và các thanh toán thành công. Chúng ta cũng thấy các bảng lưu trữ thông tin liên hệ và một bảng cầu nối gọi là contract_number_type. Bảng khác định nghĩa contract_types (ví dujL tài khoản tiết kiệm, tài khoản séc…), trong khi contract_bridge_type chứa thông tin bắc cầu.

Mô hình này theo chuẩn 3NF, các bạn cần xem chuẩn nào như nào có thể google.

Một hệ thống OLTP, dữ liệu được tập hợp trong các lô nhỏ. Ví dụ dễ hiểu là giống như một đường cao tốc với nhiều xe nhỏ, xe thể thao chạy nhanh và không liên quan đến nhau.

Khi thêm mới dữ liệu vào hệ thống OLTP, chúng ta thường làm việc mới một tập nhỏ các bản ghi và không ảnh hưởng gì dến các bản ghi khác. Ví dụ, giả sử chúng ta nhập thanh toán của 1 khách hàng vào cơ sở dữ liệu. Đầu tiên chúng ta cần xác thực thông tin tài khoản khách hàng. Sau đó sẽ nhập số tiền thanh toán, ngày tháng và các thông tin khác. Khi thiết kế một hệ thống OLTP chúng ta cần nghĩ về việc tuần suất xử lý, dữ liệu nhỏ. Và chung ta phải có khả năng hỗ trợ nhiều người dùng cùng lúc.

Tham chiếu về hệ thống tài chính của chúng ta, giờ cần thêm một thanh toán $5000 vào tài khoản 1112 cho khách hàng có ID là 11. Đây là code để xử lý:

Vì giao dịch này đang được xử lý, có nhiều các giao dịch khác cũng đang thực hiện cùng lúc. Trong thiết kế của hệ thống OLTP, điều này không vấn đề gì. Không có giao dịch nào bị hỏng, tất cả mọi thứ phải chạy mượt và “đường cao tốc” OLTP vẫn đảm bảo việc đó.

Giờ hãy xem một câu truy vấn OLTP, sẽ hiển thị dữ liệu liên quan đến người dùng ở mức nguyên tử. Giả sử ai đó với mã khách hàng “11” muốn nhìn thấy 10 giao dịch gần nhất:

SELECT 

  payments.*

FROM (

    SELECT

      ROW_NUMBER() OVER (ORDER BY payment_date DESC) AS rows,

      p.*

    FROM payment p

    WHERE customer_id = 11 ) payments

WHERE rows <= 10

 

Hoặc có lẽ cùng khách hàng đó nhưng họ muốn nhìn thấy thông tin hợp đồng trong file:


SELECT

  contracts.*

FROM contract ctr

JOIN customer cst

ON ctr.customer_id = cst.id

WHERE cst.id = 11

 

Điều quan trọng cần nhớ ở đây là các câu truy vấn đang làm việc với mô hình gọn nhẹ, nhanh và nguyên tử.

Ví dụ về ứng dụng OLAP trong thực tế:

Hãy nhìn một ví dụ ở ngữ cảnh khác: một mô hình OLAP. Mô hình OLAP hầu hết được sử dụng trong việc hỗ trợ báo cáo và phân tích.

Mô hình này là mô hình ngôi sao (star schema) để biết thêm về star schema trong data warehouse có thể đọc thêm nhé.

Trong mô hình, chúng ta có thể thấy các bảng chiều dữ liệu(dimentional): dim_customer cho khách hàng, dim_contract cho hợp đồng và dim_date cho dữ liệu ngày tháng. Có một bảng trung tâm là fact_balance. Bảng này chứa thông tin số dư cho một thờ igian cụ thể. Lại tham chiếu Vertabelo blog post để tìm hiểu về các bảng fact.

Dữ liệu không được nhập vào OLAP theo cách của OLTP. Thay vì lấy thông tin từng tí một như OLTP thì OLAP được bơm dữ liệu vào với số lượng lớn bằng các tập truy vấn quét toàn bộ nguồn dữ liệu (thường là từ hệ thống OLTP) và nhập vào OLAP. Chắc chắn câu lệnh INSERT trong OLAP lớn và chậm hơn bởi vì nó bao gồm từ rất nhiều bảng gọi là ETL (extract-transform-load) bao gồm 3 bước: extract là trích xuất dữ liệu, transform dữ liệu theo định dạng của datawarehouse và load dữ liệu vào đích.

Hãy tạo một truy vấn ETL để fill một trong các bảng OLAP, trong trường hợp này là dim_customer.

INSERT INTO

  dim_customer(

    id,

    cust_number,

    name,

    birth_date,

    email,

    main_contact_number)

SELECT

  seq.nextval,

  cst.number,

  cst.birth_date,

  cst.email,

  ccn.value

FROM customer cst

RIGHT OUTER JOIN customer_contact_number ccn

ON cst.id  = ccn.id_customer

JOIN contact_number_type cnt

ON ccn.customer_type_id = cnt.id

WHERE cnt.main = True;

 

Bạn thây rằng từ câu truy vấn, chúng ta tối ưu nhiều bảng để fill vào bảng OLAP. Câu query này phức tạp nhưng là bình thường với OLAP.

Chúng ta có thể fill dim_contract theo cách như trên. Tuy nhiên chún ta không fill dim_date như trên vì nó được định nghĩa trước trong database và các dữ liệu đó không được thay đổi. Với bảng fact_balance, xử lý fill dữ liệu lại phức tạp hơn nhiều nên không được nói chi tiết ở đây. Ở điểm này, tất cả chúng ta cần là biết bảng fact_balance lưu trữ bản chụp của dữ liệu khách hàng (như thông tin số dư tài khoản) ở một ngày nhất định.

Nếu OLTP chạy mượt như cao tốc với nhiều xe giống nhau, một cao tốc OLAP là nơi hỗ loạn với xe to nhỏ và tốc độ khác nhau. Nó có các xe to chạy chậm mà chưa ai từng thấy (truy vấn đặc biệt), các xe to chạy chậm mà chúng ta hay thấy (báo cáo tháng) hoặc các con quái vật khác…

Một câu truy vấn ví dụ của OLAP hiển thị số dư trung bình của tất cả tháng thứ 3 cho toàn bộ người dùng:

SELECT

  avg(amount)

FROM fact_balance fb

JOIN dim_date dd

ON fb.balance_date = dd.date

WHERE dd.month = 3;

 

Câu OLAP khác hiển thị tổng các khách hàng sinh sau năm 1990:

SELECT

  avg(amount)

FROM fact_balance fb

JOIN dim_customer cst

ON fb.customer_id = cst.id

WHERE EXTRACT(month from balance_date ) = 3

AND birth_date >= date('01-01-1990','dd-mm-yyyy');

 

Các câu truy vấn OLAP thường là tổng hợp và tính đến tất cả dữ liệu trong một tập con cụ thể. Chúng ta có thể tìm ra xu hướng, trung bình, tổng hợp…Các câu truy vấn này có thể tốn nhiều thời gian, phụ thuộc vào kích thước của các tập con và không thống nhất.

Tôi hy vọng bài viết này sẽ giúp bạn hiểu về sự khác nhau giữa OLTP và OLAP. Nếu có câu hỏi nào các bạn có thể comment phía dưới.



Trích nguồn từ: (academy.vertabelo.com)