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_fact
và enrollment_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 ...
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>
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];
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];
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]
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!
Đầ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
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