5

Tôi có một cơ sở dữ liệu PostgreSQL chứa các dữ liệu giáo dục khác nhau như điểm kiểm tra cấp trường và số liệu ghi danh. Tôi cần phải tách biệt việc ghi danh từ các điểm kiểm tra vì dữ liệu nằm trên các loại ngũ cốc khác nhau. Mặc dù đăng ký có mức độ chi tiết khác nhau từ dữ liệu điểm kiểm tra, nhiều tham số giống nhau. Ví dụ: Tôi có:Xử lý nhiều bảng thực tế trong Qlikview

~ ---------------------------------------------------------------------------------~ 
| Test Scores Fact                 | 
|-------------|-----------|----------|-----------|--------------|------------|-----| 
| school_code | test_code | grade_id | gender_id | ethnicity_id | subject_id | ... | 
|-------------|-----------|----------|-----------|--------------|------------|-----| 

~ --------------------------------------------------------~ 
| Enrollment Fact           | 
|-------------|----------|-----------|--------------|-----| 
| school_code | grade_id | gender_id | ethnicity_id | ... | 
|-------------|----------|-----------|--------------|-----| 

Cấu trúc này là tốt trên chương trình phụ trợ, nhưng trong Qlikview, điều này tạo ra khóa tổng hợp. Các giải pháp cho các phím tổng hợp dường như thường được thay thế bằng một bảng liên kết thông qua kịch bản Qlikview, đó cũng là cách tiếp cận của tôi. Nhưng điều này dường như không mở rộng, như khi tôi thêm một bảng thứ ba (trên một hạt khác) có chứa nhiều thứ nguyên hơn, nếu tôi tạo một bảng liên kết khác, bây giờ hai bảng liên kết của tôi bắt đầu kết hợp vì chúng chứa một số thông thường trường được đặt tên và phản hồi của Qlikview là tạo nhiều khóa tổng hợp hơn?

Tôi tương đối mới đối với Qlikview và đang làm việc một mình. Làm thế nào là nhiều sự kiện của các loại ngũ cốc khác nhau với kích thước phổ biến thường được xử lý?

EDIT:

Tôi đã cung cấp giải pháp cho vấn đề này đã hoạt động trong môi trường sản xuất chỉ dưới một năm! Xem câu trả lời của tôi dưới đây ...

Trả lời

6

Nhìn thấy mức độ phổ biến của câu hỏi này, tôi sẽ thêm giải pháp thực sự vào bản mix để mọi người có một ví dụ để làm việc, vì một lý do nào đó thực sự khó tìm được.

Tôi đã tiến hành tạo Bảng liên kết. Giải pháp này vẫn còn cho đến ngày nay cảm thấy giống như một hack vì nó tạo ra một bảng lớn chứa sản phẩm Descartes của mỗi một trong các khóa của bạn trong tất cả các bảng thực tế của bạn ... nhưng nó hoạt động.

Sự cố: Bạn có nhiều bảng thực tế trong cơ sở dữ liệu của mình; một sự xuất hiện trong hầu hết mọi cơ sở dữ liệu. Một số (hoặc tất cả) các bảng thực tế này có chung các trường khóa; không sao, phải không? Sai rồi. Thật không may, do tính chất liên kết của Qlik, thay vì mỗi bảng thực tế của bạn liên kết độc đáo với bảng tra cứu của họ, các bảng thực tế của bạn hiện đang kết hợp với nhau và tàn phá mô hình dữ liệu của bạn; tạo tham chiếu vòng tròn và số lượng khóa tổng hợp chưa được khai báo.

Giải pháp: Tạo bảng liên kết. Nghe có vẻ đơn giản, phải không? Vâng, nó là, nhưng nó cũng rất kém tài liệu và khó hiểu mà không có một lời giải thích ban đầu. Bạn có thể tự hỏi ... Link Table là gì? Đây là sản phẩm Descartes của tất cả các khóa từ tất cả các bảng thực tế của bạn. Làm cách nào để khắc phục sự cố này? Nó loại bỏ tất cả các liên kết không mong muốn giữa các bảng thực tế của bạn vì mỗi bảng sẽ chỉ chứa một khóa nối duy nhất duy nhất. Các khóa duy nhất này sẽ chỉ liên kết với Bảng Liên kết, trong đó có tất cả các khóa được ghép nối duy nhất của bạn cũng như tất cả các khóa riêng lẻ. Bảng Liên kết sau đó sẽ liên kết với các bảng tra cứu của bạn và tất cả sẽ tốt.

Thực hiện:

thực hiện này sẽ sử dụng hai bảng chứa trong câu hỏi của tôi ở trên; test_scores_factenrollment_fact.

test_scores_fact  | enrollment_fact  | school   | gender   | ... 
----------------  | ---------------  | ------   | ------   | --- 
school_code (FK)  | school_code (FK)  | school_code (PK) | gender_id (PK) | 
test_code (FK)  | grade_id (FK)  | school_name (FK) | gender_desc | 
grade_id (FK)  | ethnicity_id (FK) | address   | ...   | 
gender_id (FK)  | gender_id (FK)  | ...    | 
ethnicity_id (FK) | number_enrolled (F) | 
subject_id (FK)  | 
test_score (F)  | 

FK = Foreign Key 
PK = Primary Key 
F = Fact 

Như bạn có thể thấy, hai bảng thực tế có phím chồng chéo, school_code, grade_id, gender_id, và ethnicity_id. Trong mô hình quan hệ, mỗi trường khóa có một bảng tương ứng với thông tin bổ sung về khóa. Mô hình này không khớp với tính chất liên kết của Qlikview khi Qlikview liên kết các bảng dựa trên tên của một trường; ngay cả khi bạn không muốn nó. Bạn không muốn các trường được đặt tên để liên kết với các bảng tra cứu của chúng, tuy nhiên bạn không muốn các trường được đặt tên trong các bảng thực tế của bạn để liên kết. Rất tiếc, bạn không thể dừng hành vi này. Bạn phải triển khai Bảng Liên kết ...

  1. Trong kịch bản Qlikview của bạn, tạo ra một bảng thực tế tạm thời, mà tải trong tất cả các lĩnh vực từ bảng cơ sở dữ liệu của bạn:

    [temp_test_scores]: 
    LOAD school_code, 
        test_code, 
        grade_id, 
        gender_id, 
        ethnicity_id, 
        subject_id, 
        test_score; 
    SQL SELECT * FROM <database connection> 
    
  2. CONCATENATE phím của bạn và loại bỏ tất cả các phím cá nhân:

    [test_scores]: 
    LOAD school_code & '_' test_code & '_' grade_id & '_' gender_id & '_' ethnicity_id & '_' subject_id as test_key, 
        test_score 
    RESIDENT [temp_test_scores]; 
    
  3. Lặp lại các bước 1 & 2 cho mỗi bảng thực tế:

    [temp_enrollment]: 
    LOAD school_code, 
        grade_id, 
        ethnicity_id, 
        gender_id, 
        number_enrolled; 
    SQL SELECT * FROM <database connection> 
    
    [enrollment]: 
    LOAD school_code & '_' & grade_id & '_' & ethnicity_id & '_' & gender_id as enrollment_key, 
        number_enrolled 
    RESIDENT [temp_enrollment]; 
    
  4. Create Table liên kết của bạn bằng cách kết hợp các phím cá nhân của bạn vào một bảng duy nhất:

    [temp_link_table]: 
    LOAD DISTINCT 
        school_code, 
        test_code, 
        grade_id, 
        gender_id, 
        ethnicity_id, 
        subject_id 
    RESIDENT [temp_test_scores]; 
    
    CONCATENATE ([temp_link_table]) 
    LOAD DISTINCT 
        school_code, 
        grade_id, 
        ethnicity_id, 
        gender_id, 
        number_enrolled 
    RESIDENT [temp_enrollment]; 
    
    /** 
    * The final Link Table will contain all of the individual keys one time as well as your concatenated keys 
    */ 
    [link_table]: 
    LOAD DISTINCT 
        school_code, 
        test_code, 
        grade_id, 
        gender_id, 
        ethnicity_id, 
        subject_id, 
        school_code & '_' test_code & '_' grade_id & '_' gender_id & '_' ethnicity_id & '_' subject_id as test_key, 
        school_code & '_' & grade_id & '_' & ethnicity_id & '_' & gender_id as enrollment_key 
    RESIDENT [temp_link_table] 
    
  5. Thả bảng tạm thời của bạn để họ không xuất hiện trong mô hình dữ liệu của bạn:

    DROP TABLE [temp_test_scores]; 
    DROP TABLE [temp_enrollment]; 
    DROP TABLE [temp_link_table]; 
    

Thao tác này sẽ xóa tất cả các liên kết giữa các bảng thực tế của bạn vì hiện tại không tồn tại tên trường phổ biến nào giữa chúng. Mỗi bảng thực tế sẽ liên kết với bảng liên kết thông qua khóa được tạo nối. Bảng liên kết sau đó sẽ liên kết với từng bảng tra cứu riêng lẻ. Mô hình dữ liệu Qlikview của bạn sẽ không chứa bất kỳ khóa tổng hợp hoặc tham chiếu vòng tròn nào.

Nếu bạn tạo bảng thực tế khác trong tương lai, chỉ cần làm theo các bước 1 & 2 lần nữa và thêm bất kỳ khóa cá nhân mới nào vào Bảng liên kết và cũng thêm khóa mới được nối vào Bảng liên kết. Nó quy mô với ít nỗ lực.

Chúc may mắn!

2

Hai cách nhanh nhất tôi có thể nghĩ:

A) Bạn chỉ có thể rời khỏi gia nhập bảng thực tế vào các bảng tương ứng mà chúng được sử dụng trong Bạn sẽ chỉ cần đổi tên. các trường để tránh xung đột với các bảng khác.

B) Bạn có thể đổi tên các lĩnh vực phổ biến, có thể được thực hiện bằng cách

  1. sử dụng một QUALIFY (trước khi bạn tải các bảng thực tế) và UNQUALIFY (sau khi bạn tải các bảng thực tế)
  2. đổi tên trường sử dụng "[Tên trường cũ] dưới dạng [Tên trường mới]"

Giả sử các bảng thực tế có tên trường duy nhất có thể được liên kết với bảng chính, bạn không cần phải đổi tên bất kỳ điều gì trong chính bàn

Tôi muốn sử dụng B-1, vì điều đó có vẻ hơi rắc rối một chút.

QUALIFY 
A, 
B, 
C, 
ID; 

FactTable1: 
Load ID, 
A, 
B, 
C, 
From [FactTable1]; 

FactTable2: 
Load ID, 
A, 
B, 
C, 
From [FactTable2]; 

UNQUALIFY 
A, 
B, 
C, 
ID; 

EDIT: Nếu bạn muốn tạo một bảng liên kết từ này, bạn có thể nối các bảng thực tế vào một bảng nơi bạn đặt tất cả các cột vào nó (sẽ có null cho rất nhiều các cột, nhưng QlikView là tốt với null).

Điều tôi thường làm là tải các bảng thực tế và tạo trường id (hoặc RowNo() hoặc autonumberhash128 ([danh sách tên trường id duy nhất]), sau đó khi tôi tải chúng vào bảng liên kết, tôi bao gồm id đó cuối cùng, tôi thả tất cả các trường phổ biến từ các bảng thực tế, vì vậy chúng chỉ tồn tại trong bảng liên kết.

+0

Đầu tiên, cảm ơn bạn đã dành thời gian trả lời. Thứ hai, tôi đã chỉnh sửa bài đăng chính của mình bằng một ví dụ cụ thể hơn. Trước khi tôi bắt đầu thực hiện bất cứ điều gì tôi chỉ muốn chắc chắn rằng tôi hiểu những gì tôi đang làm. Qualify thêm tên hai phần vào trường, vì vậy nếu nó là class_id, bây giờ nó sẽ là enroll_fact.grade_id. Qlikview liên kết trường hiện đủ điều kiện như thế nào? – bdiamante

+0

Bạn sẽ phải đổi tên các trường trong bảng mới để kết nối với cột đúng. Vì vậy, nếu bạn muốn enroll_fact.grade_id, bạn sẽ cần phải đổi tên class_id trong bảng khác để liên kết với nó. – AllGoldNinja

2

Tuy nhiên, mỗi bảng thực tế có một tập hợp con khác của "chia sẻ "các trường, vì vậy tôi sẽ không thể khóa chính xác trong các bảng thực tế của tôi.

Một trong những yếu tố đầu vào chiều Descartes của bạn sẽ là 'N/A' chống lại Chủ đề và luật thi (kể từ đó không có trong bảng tuyển sinh)

Vì vậy, khi bạn đo lường bởi 'Giới tính' Test Điểm số phù hợp với các bản ghi kích thước với các đối tượng và mã kiểm tra hợp lệ và kết quả đăng ký đối với các bản ghi có 'N/A' đối tượng và mã kiểm tra

Sau đó, khi bạn cuộn lên theo Giới tính, mọi thứ sẽ hoạt động tốt.

4

Có hai chiến lược chính để xây dựng mô hình dữ liệu trong QlikView để xử lý nhiều bảng thực tế:

  1. Nối bảng thực tế của bạn vào một bảng thực tế duy nhất - thường gọi là SỰ THẬT nối như cú pháp QlikView cho việc thêm dữ liệu vào bảng là sử dụng tiền tố CONCATENATE (số tương đương với hoạt động của SQL UNION)

  2. Tạo một bảng liên kết (những gì bạn đã làm cho đến nay) Đối với phần lớn các triển khai , tùy chọn 1 là phương pháp thích hợp. Thuộc tính của một thực tế nối thể được tóm tắt như sau:

Tích cực:

  1. hoạt động tốt do số lượng giảm của bảng lớn trong mô hình dữ liệu
  2. đơn giản để thực hiện, chỉ cần thêm tất cả dữ liệu vào một bảng thực tế chung trong khi đảm bảo các tham số chung được tham chiếu theo các tên trường chung

Phủ định:

  1. Các sự kiện khác nhau KHÔNG được liên kết trực tiếp với nhau. Hàm ý là quan trọng để hiểu. Điều đó có nghĩa là phân tích chéo các sự kiện thường chỉ có thể đạt được bằng các tham số chung. Bất kỳ thứ nguyên cụ thể nào không kết nối theo bất kỳ cách nào với các bản ghi của các sự kiện không tham chiếu đến các tham số này. Cú pháp 'phân tích tập hợp' có thể giảm thiểu thiếu sót này, nhưng nếu yêu cầu cốt lõi của bạn là phân tích gián tiếp thực tế A theo kích thước thực tế cụ thể của B thì bạn có thể cần phải hoàn nguyên về mô hình bảng liên kết thay thế.

Cách xây dựng các bảng liên kết là một chủ đề phức tạp nhưng dựa trên các kỹ thuật thiết kế bảng liên kết cơ sở dữ liệu truyền thống. Nó rất dễ dàng để đi sai và sản xuất các bảng liên kết có vẻ như để sản xuất các kết quả chính xác trong front-end nhưng là quá lớn, tiêu thụ bộ nhớ và tài nguyên CPU.

Theo kinh nghiệm của tôi, mô hình dữ liệu QlikView được mô hình kém là thủ phạm phổ biến nhất gây ra hiệu suất kém.

Tôi hy vọng điều này nhanh chóng, xa hoàn toàn, giới thiệu mô hình đa thực tế trong QlikView chứng minh một số trợ giúp và đặt bạn vào đúng khóa học.

Các vấn đề liên quan