Bài viết này dành cho các bạn mới tìm hiểu về xây dựng mô hình dữ liệu (Data Modeling) trong Power BI Desktop, hướng dẫn cách tạo mối quan hệ hoạt động (Active) hoặc không hoạt động (Inactive) trong mô hình dữ liệu. Các mối quan hệ hoạt động (active relationship) truyền các bộ lọc đến các bảng khác một cách mặc định còn các mối quan hệ không hoạt động (inactive relationship) chỉ áp dụng các bộ lọc khi biểu thức DAX USERELATIONSHIP() được sử dụng.

Lưu ý: Phần giới thiệu về mối liên kết giữa các mô hình không được đề cập trong bài viết này. Nếu bạn chưa rõ về đặc điểm hoặc cách định cấu hình chúng, bạn có thể nên tìm hiểu thêm tại bài viết Data Model: Tạo cấu trúc và phân tích dữ liệu trong Power BI.

Active Relationships

Trong mô hình dữ liệu, chúng ta nên xác định các mối liên kết Active Relationship bất cứ khi nào có thể. Từ đó, chúng ta có thể mở rộng tính năng phân tích của báo cáo và người dùng khi làm việc với Q&A và có thể dễ dàng sử dụng model của bạn.

Một ví dụ về một model Import được thiết kế để phân tích tình hình chuyến bay đúng giờ của các hãng hàng không. Mô hình này bao gồm bảng Flight, đây là nơi lưu trữ thông tin chi tiết mỗi chuyến bay trong mỗi hàng. Các hàng này ghi lại ngày bay, số hiệu chuyến bay, sân bay khởi hành và đến, và bất kỳ thời gian trễ nào (tính bằng phút). Ngoài ra còn có bảng Airport lưu mỗi hàng với một tên sân bay cụ thể. Mỗi hàng mô tả mã sân bay, tên sân bay và quốc gia.

Bảng Flight và Airport có sự liên kết với nhau
Bảng Flight và Airport có sự liên kết với nhau

Bảng Flight và Airport có sự liên kết với nhau. Trong bảng Flight, cột DepartureAirportArrivalAirport liên quan đến cột Airport của bảng Airport. Trong thiết kế star schema, bảng Airport được mô tả như một dimension. Trong model này, nó có hai vai trò là ArrivalAirportDepartureAirport.

Mặc dù thiết kế này hoạt động tốt trong star schema, nhưng nó không phù hợp với các model của Power BI. Lí do là bởi vì các mối quan hệ mô hình là các đường dẫn truyền bộ lọc và các đường dẫn này phải xác định (lọc theo 1 cột).

Vì lý do này, một mô hình không thể có nhiều Active Relationship giữa hai bảng. Do đó, ngoài Active Relationship đã có, các mối quan hệ khác được đặt trong inactive relationship được biểu thị bằng đường đứt nét. Cụ thể, đó là mối quan hệ với cột ArrivalAirport đang hoạt động. Điều này có nghĩa là các bộ lọc áp dụng cho bảng Airport sẽ tự động truyền đến cột ArrivalAirport của bảng Flight.

Tuy nhiên, mô hình này lại có những hạn chế nghiêm trọng về dữ liệu có thể được báo cáo. Cụ thể, với mô hình trên, chúng ta không thể lọc bảng Aiport để tự động tách biệt thông tin chi tiết chuyến bay lúc khởi hành (Departure Airport). Vì các yêu cầu báo cáo liên quan đến việc lọc (hoặc nhóm) theo sân bay đi và đến cùng một lúc, nên cần có hai mối quan hệ Active Relationship này. Chuyển yêu cầu này thành thiết kế mô hình Power BI có nghĩa là mô hình phải có hai bảng airport.

Mô hình phải có hai bảng Airport
Mô hình phải có hai bảng Airport

Bây giờ mô hình này đã có 2 bảng Airport: Departure Airport và Arrival Airport. Mối quan hệ giữa các bảng và bảng Flight đã được kích hoạt. Các tên cột ở bảng Departure Airport và Arrival Airport được chỉnh sửa lại từ các từ như Departure hoặc Arrival.

Tên cột ở bảng Departure Airport và Arrival Airport được chỉnh sửa
Tên cột ở bảng Departure Airport và Arrival Airport được chỉnh sửa

Phương pháp tái cấu trúc

Đây là một phương pháp để cấu trúc lại mô hình từ một bảng dimension đóng vai trò duy nhất sang thiết kế với một bảng cho mỗi vai trò nhất định.

  • Loại bỏ mọi Inactive Relationship.
  • Cân nhắc đổi tên bảng dimension để mô tả rõ hơn vai trò của nó. Trong ví dụ, bảng Airport liên quan đến cột ArrivalAirport của bảng Flight, vì vậy nó được đổi tên thành Arrival Airport.
  • Tạo một bản sao của bảng để cung cấp một tên để thể hiện vai trò của nó. Nếu đó là bảng Import, bạn có thể cân nhắc sử dụng DAX tạo bảng. Nếu đó là bảng DirectQuery, bạn có thể sao chép truy vấn Power Query.

Trong ví dụ, bảng Departure Airport được tạo bằng các bảng được tính toán sau đây:

				
					Departure Airport = 'Arrival Airport'
				
			
  • Tạo một Active Relationship cho bảng mới.
  • Cân nhắc đổi tên các cột trong bảng để cung cấp chính xác vai trò của chúng. Trong ví dụ trên, tất cả các cột đều có tiền tố là Departure hoặc Arrival. Những tên này đảm bảo báo cáo và sẽ có mô tả cụ thể giữa 2 bảng. Và cũng cải thiện trải nghiệm Hỏi & Đáp, cho phép người dùng dễ dàng viết câu hỏi của họ.
  • Cân nhắc thêm mô tả vào bảng phân vai. (Trong trường Field, mô tả xuất hiện trong chú thích công cụ khi người làm báo cáo di con trỏ qua bảng.) Bằng cách này, bạn có thể thông báo bất kỳ chi tiết truyền bộ lọc bổ sung nào cho các báo cáo của bạn.

Inactive Relationship

Trong trường hợp đặc biệt, các mối quan hệ của Inactive Relationship có thể giải quyết các nhu cầu bảng báo cáo đặc biệt, điển hình là với Role-playing Dimension.

Bây giờ chúng ta hãy xem xét các yêu cầu về mô hình và báo cáo:
  • Mô hình bán hàng bao gồm bảng Sales có 2 cột là OrderDateShipDate.
  • Mỗi hàng trong bảng Sales ghi lại từng đơn hàng order.
  • Bộ lọc ngày thường được dùng cho cột OrderDate để lưu các ngày cụ thể.
  • Chỉ có một measure yêu cầu bộ lọc ngày đến cột ShipDate và cột này gồm các ô trống (BLANKs) cho đến khi đơn hàng được giao.
  • Không bắt buộc phải lọc đồng thời hoặc theo nhóm trong order và ngày ship.
Một phần model của 2 bảng
Một phần model của 2 bảng

Bảng Sales và Date có sự liên kết với nhau. Trong bảng Sales, cột OrderDateShipDate có liên quan đến cột Date của bảng Date. Trong model này thì có 2 vai trò của bảng Date là cung cấp dữ liệu ngày order và ngày ship.

Có 6 hàm tính sẽ được lọc bới cột OrderDate nhưng sẽ có hàm Orders Shipped được lọc bới cột ShipDate.

Ví dụ: hàm Orders dưới đây chỉ đơn giản là tính các hàng của bảng Sales. Các bộ lọc sẽ áp dụng cho bảng Date sẽ kết nối đến cột OrderDate.

				
					Orders = COUNTROWS(Sales)
				
			

Hàm Orders Shipped sẽ sử dụng USERELATIONSHIP của hàm DAX để tạo bộ lọc kết nối đến cột ShipDate.

				
					Orders Shipped =
CALCULATE(COUNTROWS(Sales), 
USERELATIONSHIP('Date'[Date], Sales[ShipDate])
)
				
			

Model này hỗ trợ tạo ra bảng báo cáo sau:

Model này hỗ trợ tạo ra bảng báo cáo
Model này hỗ trợ tạo ra bảng báo cáo

Trang báo cáo lọc theo quý 2019 Q4. Đây là bảng trực quan nhóm theo tháng hiển thị các thống kê bán khàng khác nhau. Các hàm tính Orders và Orders Shipped cho ra nhiều kết quả khác nhau. Chúng cùng sử dụng chung một phương pháp đó là tính hàng tròn bảng Sales nhưng truyền bộ lọc qua bảng Date là khác nhau.

Lưu ý rằng bộ slicer bao gồm một mục BLANK, đây là slicer từ bảng mở rộng table expansion. Mặc dù mỗi hàng trong bảng Sales có ngày đặt hàng, một số hàng có ngày giao hàng là (Blank) có nghĩa là những đơn hàng này vẫn chưa được giao. Bảng mở rộng cũng xem xét các mối quan hệ inactive relationship và do đó các BlANKs xuất hiện do các vấn đề về độ chính xác của dữ liệu (data integrity).

Kết luận

Chúng ta nên xác định các Active Relationship bất cứ lúc nào có thể. Vì mối quan hệ này sẽ mở rộng phạm vi và tiềm năng cho cả người tạo báo cáo và người dùng làm việc với Q&A để có thể sử dụng bảng báo cáo của bạn. Điều đó có nghĩa là các bảng dimension phải được sao chép trong báo cáo của bạn.

Tuy nhiên, trong các trường hợp cụ thể, bạn có thể xác định một hoặc nhiều Inactive Relationship cho bảng dimension. Vì vậy ta có thể xem xét khi:

  • Không yêu cầu bảng báo cáo phải lọc đồng thời theo các vai trò khác nhau
  • Bạn sử dụng hàm USERELATIONSHIP của DAX để kích hoạt một relationship cụ thể cho các tính toán liên quan.
Đọc thêm: Hướng dẫn về Active và Inactive Relationships - Microsoft Learn (Tiếng Anh)