Chào mọi người.
Mình đang tranh luận với vài đồng nghiệp về Data Modelling theo kiểu Kimball.
Vấn đề xoay quanh việc liệu có phải là xấu không khi thiết kế mô hình dữ liệu có hai fact table trở lên.
Những lý lẽ phản đối mình là:
– Nó dẫn đến nguy cơ M:M joins
-
Trái với nguyên tắc Kimball (https://www.kimballgroup.com/data-warehouse-business-intelligence-resources/kimball-techniques/dimensional-modeling-techniques/multipass-sql/ )
– Nó dẫn đến truy vấn chậm
Theo mình, không có lý lẽ nào liên quan đến việc các table là fact table cả, mà vấn đề nằm ở bản chất của từng table, cách triển khai và truy vấn.
Xem xét mô hình dữ liệu bên dưới
Có hai fact table. Một table chứa thông tin về đơn hàng, một số chỉ số như “DeliveryCost”, và một số ID liên kết đến các dimension table mô tả chi tiết ở cấp đơn hàng. Table kia, factOrderItems, chứa các mặt hàng trong mỗi đơn hàng, số lượng và giá của chúng, cũng như một số chi tiết ở cấp mặt hàng như loại sản phẩm, v.v.
Mô hình dữ liệu này có vẻ hoàn toàn hợp lý với mình, mặc dù có quan hệ khóa ngoại giữa hai fact table. Quan hệ giữa chúng là 1:M và do đó sẽ không có hiện tượng cartesian joins.
Khi mình trình bày mô hình này, các đồng nghiệp đề xuất một trong hai giải pháp:
a. Ghép hai fact table lại Tạo một fact table duy nhất từ hai fact table, trong đó granularity/PK trở thành OrderItemID. Điều này có vẻ lãng phí với mình, vì tất cả thông tin như StoreID, CustomerID, v.v. sẽ bị trùng lặp. Thêm vào đó, các chỉ số như DeliveryCost cũng bị trùng lặp và sẽ cần phải được tính toán lại khi làm việc với chúng.
b. Sao chép các trường cần thiết
Một đề xuất khác là sao chép các trường cần thiết từ factOrder table sang factOrderItems table. Ví dụ: Tạo một khóa ngoại mới trong factOrderItems gọi là CustomerID, và giá trị sẽ giống nhau cho mỗi dòng OrderItem. Điều này cũng có vẻ lãng phí vì lý do như trên, cộng thêm việc mỗi khi có trường hợp sử dụng mới, chúng ta sẽ cần phải sửa đổi table để thêm khóa ngoại mới. Thứ ba, kết quả cuối cùng là rất nhiều khóa ngoại ở khắp mọi nơi.
Chưa bao giờ trong sự nghiệp của mình mình gặp phải kiểu giáo điều “chỉ một fact table” này. Các bạn có lý do cụ thể nào cho thấy đồng nghiệp mình đúng không?
Cập nhật:
Mình nghe nhiều người nói rằng, theo Kimball, người ta nên cập nhật mô hình thành kiểu như bên dưới, trong đó các fact table không được nối trực tiếp, mà thông qua một dimension table Order không chứa các chỉ số ở cấp “đơn hàng”.