BI mã nguồn mở 2 — Metabase căn bản & self-service
Metabase: "hỏi một câu hỏi về dữ liệu"
Trong bài tổng quan chúng ta đã đặt Metabase và Superset lên bàn cân. Bài này đi sâu vào Metabase — công cụ mà triết lý thiết kế gói gọn trong một hành động: Ask a question (hỏi một câu hỏi). Đối tượng mà Metabase nhắm tới không phải data engineer mà là cán bộ nghiệp vụ: một chuyên viên phòng huy động vốn muốn biết "chi nhánh nào có số dư tiền gửi cao nhất tháng này?" nhưng không viết nổi một câu GROUP BY.
Metabase giải bài toán đó bằng một query builder trực quan: người dùng chọn bảng, kéo thả filter, chọn cách tổng hợp (summarize) và cách vẽ (visualize) — Metabase âm thầm dịch những lựa chọn đó thành SQL và chạy trên database. Kết quả: nghiệp vụ tự trả lời được 80% câu hỏi thường ngày, team dữ liệu thoát khỏi vai trò "người viết SQL theo yêu cầu" (ad-hoc query factory) để tập trung vào việc khó hơn.
Điểm khác biệt cốt lõi so với Superset là rào cản đầu vào. Superset mạnh cho người biết SQL và cần kiểm soát chi tiết; Metabase mạnh ở khả năng trao quyền self-service (tự phục vụ) cho người hoàn toàn không rành kỹ thuật. Bài này tập trung vào con đường no-code đó, có đối chiếu với SQL tương đương để bạn — với vai trò kỹ thuật — hiểu chính xác Metabase đang làm gì bên dưới.
Cài đặt & kết nối database
Metabase là ứng dụng Java (một file .jar hoặc Docker image metabase/metabase). Lần đầu chạy, nó cần một application database — nơi lưu metadata (câu hỏi, dashboard, người dùng, quyền). Mặc định là H2 nhúng, nhưng tuyệt đối không dùng H2 cho production: hãy trỏ sang Postgres riêng qua biến môi trường MB_DB_TYPE, MB_DB_HOST, v.v. H2 dễ hỏng và không backup an toàn.
Sau khi lên, việc đầu tiên là thêm data source (Admin → Databases → Add). Metabase hỗ trợ sẵn Postgres, MySQL, SQL Server, BigQuery, Snowflake, Redshift... Bạn nhập host, port, tên database, và tài khoản chỉ đọc (read-only) — đây là nguyên tắc bắt buộc: BI không bao giờ cần quyền ghi lên database nghiệp vụ.
Đồng bộ schema và phân loại field
Ngay khi kết nối, Metabase chạy hai tác vụ nền quan trọng:
- Sync schema: quét danh sách bảng, cột, kiểu dữ liệu. Chạy định kỳ (mặc định hằng giờ) để bắt kịp thay đổi cấu trúc.
- Scan field values / fingerprinting: lấy mẫu dữ liệu để đoán ngữ nghĩa mỗi cột và liệt kê giá trị phân biệt cho các cột phân loại (để dựng dropdown filter).
Kết quả là Metabase gán cho mỗi field một Type, gồm hai lớp:
| Lớp | Ví dụ | Tác dụng |
|---|---|---|
| Data type | Integer, Text, DateTime, Number | Kiểu vật lý, ít khi sửa |
| Semantic type | Currency, City, Entity Key, Foreign Key, Category | Quyết định cách hiển thị & lọc |
Việc phân loại field đúng rất quan trọng cho trải nghiệm nghiệp vụ. Ví dụ với schema ngân hàng mẫu: đánh dấu accounts.balance là Currency (VND/USD), customers.city là City, transactions.kind là Category, và khai báo transactions.account_id → accounts.id là Foreign Key. Khi đó Metabase tự hiển thị số dư có ký hiệu tiền tệ, gợi ý bản đồ theo thành phố, và cho phép người dùng nhấp từ giao dịch "xuyên" (drill) sang tài khoản mà không cần viết JOIN.
Ở Admin → Table Metadata bạn cũng có thể ẩn bảng kỹ thuật (bảng staging, audit log) khỏi mắt người dùng cuối, đặt lại tên hiển thị thân thiện ("Sổ giao dịch" thay vì transactions), và viết mô tả cột. Đây là bước "dọn nhà" tối thiểu trước khi mở cửa cho nghiệp vụ.
Question: query builder không cần code
Trái tim của Metabase là Question — một câu hỏi được lưu lại. Có hai cách tạo: query builder (trực quan, no-code) và native query (viết SQL tay). Phần này nói về query builder; native query thuộc chủ đề nâng cao ở bài Metabase nâng cao.
Query builder có bốn bước tư duy, khớp gần như 1-1 với một câu SQL:
- Data: chọn database và bảng gốc (VD: Transactions).
- Filter: thêm điều kiện lọc — tương đương
WHERE. Với field ngày, Metabase cho chọn "30 ngày qua", "quý này" thay vì gõ biểu thức. Field Category cho dropdown chọn giá trị. - Summarize: chọn metric (Count of rows, Sum of, Average of...) và group by một hay nhiều field. Đây chính là
GROUP BY+ hàm tổng hợp. - Visualize: chọn cách hiển thị — table, bar, line, số đơn (big number), pie, map...
Metabase đoán loại biểu đồ hợp lý theo cấu trúc kết quả: group theo một trường phân loại → gợi ý bar; group theo thời gian → gợi ý line; không group, chỉ một con số → gợi ý big number.
SQL tương đương: số giao dịch & tổng amount theo kind
Hãy dựng một câu hỏi nghiệp vụ điển hình: "Mỗi loại giao dịch (nạp/rút/chuyển) có bao nhiêu giao dịch và tổng số tiền là bao nhiêu?". Trong query builder: chọn bảng Transactions → Summarize → Count và Sum of Amount → Group by Kind → Visualize bar. SQL mà Metabase sinh ra tương đương với:
-- ▶ Chạy được
SELECT kind, COUNT(*) AS so_giao_dich, SUM(amount) AS tong_tien
FROM transactions
GROUP BY kind
ORDER BY tong_tien DESC;
Đây là biểu đồ bar cơ bản. Người dùng nghiệp vụ chỉ nhấp bốn cú chuột, còn bạn thấy rõ nó chỉ là một GROUP BY kind.
SQL tương đương: số dư trung bình theo currency
Câu hỏi tiếp: "Số dư trung bình và tổng số dư theo từng loại tiền tệ?". Query builder: bảng Accounts → Summarize Average of Balance và Sum of Balance → Group by Currency → Visualize table hoặc bar.
-- ▶ Chạy được
SELECT currency,
COUNT(*) AS so_tai_khoan,
AVG(balance) AS so_du_tb,
SUM(balance) AS tong_so_du
FROM accounts
GROUP BY currency
ORDER BY tong_so_du DESC;
Nếu bạn đã đánh dấu balance là Currency, Metabase hiển thị các cột này kèm định dạng tiền tệ tự động.
SQL tương đương: đếm khách theo thành phố
Câu hỏi thứ ba, phục vụ phân bổ địa lý mạng lưới chi nhánh: "Có bao nhiêu khách hàng ở mỗi thành phố?". Query builder: bảng Customers → Summarize Count → Group by City → Visualize map hoặc bar ngang.
-- ▶ Chạy được
SELECT city, COUNT(*) AS so_khach_hang
FROM customers
GROUP BY city
ORDER BY so_khach_hang DESC
LIMIT 20;
Ba câu hỏi trên đều chỉ chạm một bảng — đúng với những gì query builder tạo mặc định. Khi cần dữ liệu từ nhiều bảng, Metabase dùng join qua Foreign Key đã khai báo (VD nối Transactions với Accounts để lọc theo currency), hoặc bạn dùng models (mục dưới) để giấu JOIN khỏi người dùng cuối.
Lưu Question & tổ chức trong Collection
Mỗi Question sau khi tạo được Save với một cái tên. Nhưng nếu để rải rác, chỉ sau vài tháng bạn sẽ có "bãi rác câu hỏi". Metabase tổ chức bằng Collection — thư mục phân cấp, gán quyền được.
Cấu trúc Collection nên phản chiếu cơ cấu tổ chức, không phải cơ cấu kỹ thuật:
- Huy động vốn → dashboard & question về tiền gửi theo chi nhánh.
- Giao dịch & thanh toán → phân tích lưu lượng giao dịch.
- Khách hàng → phân khúc, phân bổ địa lý.
- Một Collection Nháp cá nhân (Personal Collection) tự động cấp cho mỗi người để thử nghiệm mà không làm loạn không gian chung.
Collection có thể gắn quyền View / Curate / No access theo nhóm. Đây là cơ chế phân quyền chính của Metabase (chi tiết ở mục cuối). Việc đặt một Question vào Collection nào quyết định ai được thấy nó.
Dashboard: ghép nhiều question thành bức tranh
Dashboard là lưới các card, mỗi card là một Question đã lưu. Bạn kéo thả để bố trí, đổi kích thước, thêm tiêu đề và text giải thích. Một dashboard "Tổng quan huy động chi nhánh" có thể gồm: big number tổng số dư, bar số dư theo currency, line xu hướng số dư theo tháng, table top khách hàng.
Ba năng lực làm dashboard Metabase mạnh hơn một tập biểu đồ tĩnh:
Dashboard filter dùng chung
Bạn thêm một dashboard filter ở đầu dashboard (VD filter Currency hoặc Khoảng thời gian) rồi wire (nối) nó vào nhiều card cùng lúc. Người dùng chọn "USD" một lần, mọi card phản ứng đồng loạt. Về bản chất, Metabase chèn điều kiện đó vào WHERE của từng câu hỏi con. Đây là điểm giúp một dashboard phục vụ nhiều chi nhánh: chỉ cần đổi filter Chi nhánh là toàn bộ số liệu đổi theo.
Click-through & drill-through
Khi nhấp vào một cột trong biểu đồ, Metabase mở menu drill: "Xem các bản ghi này", "Zoom theo thời gian", "Nhóm theo trường khác", hoặc đi tới dashboard/URL khác (click-through do bạn cấu hình). Nhờ Foreign Key, người dùng có thể nhấp từ một loại giao dịch → xem danh sách tài khoản liên quan → xem khách hàng, mà không viết một dòng SQL nào.
Auto-refresh & full-screen
Dashboard đặt được chu kỳ tự làm mới (1/5/10 phút...) và chế độ toàn màn hình để chiếu lên màn hình phòng giao dịch.
X-ray: tự động khám phá dữ liệu
X-ray là tính năng "khám phá tức thì". Trỏ vào một bảng, một cột, hay một điểm dữ liệu bất kỳ và chọn X-ray this, Metabase tự sinh ngay một dashboard khám phá: phân bố giá trị, xu hướng theo thời gian, các phân nhóm đáng chú ý. Với một cán bộ mới, X-ray bảng Customers trong 5 giây cho thấy phân bố theo thành phố, theo thời điểm mở tài khoản — không cần tự dựng gì. X-ray là công cụ khởi động rất tốt, nhưng nên xem nó là điểm bắt đầu để tinh chỉnh, chứ không phải sản phẩm cuối để trình lãnh đạo.
Models: lớp dữ liệu sạch cho người dùng cuối
Một cạm bẫy của self-service: nếu để nghiệp vụ đối diện thẳng bảng thô, họ dễ join sai, lọc thiếu, hiểu nhầm cột. Model (trước đây gọi "dataset") là câu trả lời của Metabase — một lớp trừu tượng nằm giữa bảng thô và người dùng.
Một model là một Question đặc biệt được "phong" thành nguồn dữ liệu tái sử dụng. Với model bạn có thể:
- Đóng gói JOIN sẵn: tạo model "Giao dịch đầy đủ" đã nối Transactions → Accounts → Customers, để nghiệp vụ có ngay tên khách và thành phố mà không tự viết JOIN.
- Đổi tên & mô tả cột thân thiện, ẩn cột kỹ thuật.
- Gán lại semantic type, thêm cột tính toán.
Sau đó người dùng "Ask a question" trên model thay vì trên bảng thô. Model chính là cách Metabase tiến gần tới ý tưởng semantic layer — chủ đề được đào sâu ở bài semantic & metrics và liên quan tới cách chuẩn hoá metric & KPI. Nó khiến câu trả lời của mọi người nhất quán vì cùng xuất phát từ một định nghĩa dữ liệu.
Pulses / Subscriptions: gửi báo cáo định kỳ
Không phải ai cũng vào Metabase mỗi ngày. Subscription (bản kế thừa của "Pulse") cho phép gửi định kỳ kết quả dashboard hoặc question qua email hoặc Slack theo lịch (hằng ngày 8h sáng, mỗi thứ Hai...). Ví dụ: gửi cho ban giám đốc chi nhánh một email 7h sáng mỗi ngày kèm bảng "Tổng số dư huy động hôm qua theo currency". Subscription tôn trọng phân quyền của người nhận và có thể áp giá trị filter cố định (chỉ gửi số liệu chi nhánh của người đó). Đây là cách "đẩy" thông tin đến người bận rộn thay vì chờ họ "kéo".
Phân quyền cơ bản
Metabase phân quyền theo Group (nhóm người dùng), với hai trục chính:
- Data permissions: mỗi Group được cấp quyền tới từng database/schema — Unrestricted, Granular (theo bảng), No self-service, hoặc chặn hẳn native SQL. Đây là nơi bạn quyết định ai được query bảng nào.
- Collection permissions: quyền View / Curate / No access trên từng Collection — quyết định ai thấy/sửa được câu hỏi, dashboard nào.
Hai nhóm mặc định là Administrators (toàn quyền) và All Users (nên siết lại). Thực hành tốt: tạo Group theo phòng ban (Huy động, Giao dịch, Rủi ro), cấp mỗi Group quyền đọc đúng phần dữ liệu và Collection của họ. Phân quyền dữ liệu chi tiết ở cấp dòng (row-level, VD mỗi chi nhánh chỉ thấy số của mình) thuộc bản Pro/Enterprise và được bàn ở bài governance & security.
Use case thực tế
Bối cảnh. Phòng Huy động vốn NCB muốn theo dõi tiền gửi theo chi nhánh và loại tiền mà không phụ thuộc team dữ liệu cho từng yêu cầu nhỏ. Trước đây, mỗi báo cáo mất trung bình 2 ngày chờ analyst viết SQL và xuất Excel.
Triển khai (self-service).
- Kết nối read-only tới database nghiệp vụ; đánh dấu
balancelà Currency,citylà City, khai báo Foreign Keyaccounts.customer_id → customers.id. - Tạo model "Số dư khách hàng" đã join Accounts → Customers, ẩn cột kỹ thuật, đổi tên cột thân thiện.
- Cán bộ nghiệp vụ tự dựng 3 Question bằng query builder: tổng số dư theo currency, đếm khách theo thành phố, số giao dịch theo kind — tương ứng đúng ba block SQL ở trên.
- Ghép thành dashboard "Huy động chi nhánh" với dashboard filter Currency + Thời gian nối vào cả ba card; bật drill-through.
- Đặt subscription email 7h sáng gửi ban giám đốc bảng tổng số dư hôm qua.
- Phân quyền: Group Huy động có quyền View trên Collection tương ứng, không được chạy native SQL.
Kết quả (minh hoạ). Thời gian ra một báo cáo mới giảm từ ~2 ngày xuống dưới 30 phút do nghiệp vụ tự làm; số yêu cầu ad-hoc gửi team dữ liệu giảm rõ rệt, giải phóng thời gian cho công việc kỹ thuật sâu hơn. (Các con số là minh hoạ cho mô hình vận hành.)
Ghi nhớ
- Triết lý Metabase là self-service cho người không rành SQL: query builder dịch chọn-bảng / filter / summarize / visualize thành SQL.
- Kết nối read-only, để Metabase sync schema và phân loại field (Currency, City, Foreign Key) đúng — đây là nền tảng cho trải nghiệm drill và định dạng.
- Question là câu hỏi lưu lại; tổ chức trong Collection theo phòng ban, không theo cấu trúc kỹ thuật.
- Dashboard mạnh nhờ filter dùng chung (nối một filter vào nhiều card → chèn
WHERE) và drill-through qua Foreign Key. - Query builder mặc định chạm một bảng; muốn giấu JOIN và chuẩn hoá định nghĩa, dùng models — bước tiến tới semantic layer.
- X-ray để khám phá nhanh; subscriptions để đẩy báo cáo email/Slack định kỳ.
- Phân quyền theo Group trên hai trục Data và Collection; row-level cần bản Pro/Enterprise.
- Ba SQL "▶ Chạy được" trong bài là bản tương đương chính xác của các Question query builder điển hình cho dashboard huy động/giao dịch.
Bài viết liên quan
Phân biệt ước lượng điểm và ước lượng khoảng, cách xây khoảng tin cậy (CI) bằng margin of error z*·SE / t*·SE, đánh đổi mức 90/95/99%, và cách DIỄN GIẢI ĐÚNG khoảng tin cậy (95% CI không phải xác suất tham số nằm trong khoảng). Có CI cho trung bình và cho tỷ lệ, ảnh hưởng của cỡ mẫu, cùng ví dụ ngân hàng về tỷ lệ nợ xấu và số dư trung bình.
Kimball dimensional modeling: bảng fact/dimension, star vs snowflake, grain, và Slowly Changing Dimension.
Khối OLAP, các thao tác drill-down/roll-up/slice & dice/pivot, OLAP vs OLTP và ROLAP/MOLAP/HOLAP.
Từ nguồn dữ liệu qua ETL/ELT vào Data Warehouse, Data Mart đến dashboard; staging, ODS, batch vs streaming.