2010-08-12 10 views
3

Je développe un entrepôt de données et je me suis heurté à un problème dont je ne suis pas sûr. Le schéma actuel est défini ci-dessous:Conception de l'entreposage de données Question

DimInstructor < - Table Dimension pour les instructeurs DimStudent < - Table Dimension pour les étudiants

Je veux mettre en œuvre un scénario dans lequel si les détails d'un changement d'instructeur dans ma base de données OLTP, je veux pour ajouter un nouvel enregistrement dans la table DimInstructor pour des raisons de génération de rapports historiques.

Maintenant, je veux créer une table de dimension de leçon appelée DimLesson. Dans DimLesson je veux créer une référence à l'instructeur.

La table DimInstructor contient:

InstructorDWID < - champ d'identité lorsqu'il est entré dans DW InstructorID < - L'ID d'instructeur qui est venu de la base de données OLTP

Maintenant, je ne peux pas faire InstructorID primaire key car il n'est pas garanti d'être unique (si l'instructeur modifie son nom, il y aura 2 enregistrements dans le DW avec la même valeur InstructorID). Donc, ma question est, comment puis-je référencer l'instructeur de DimLesson? Est-ce que j'utilise le InstructorDWID? Si oui, devrais-je avoir 2 entrées pour un instructeur dans DimInstructor, cela rendrait les requêtes plus compliquées quand je veux regarder toutes les leçons par un instructeur spécifique.

Toute aide serait appréciée!

Répondre

1

Paul,

Il y a plusieurs façons vous pouvez gérer cela. Vous pouvez utiliser une date/date d'inactivité, un numéro de séquence ou un numéro de version pour différencier les enregistrements avec le même InstructorID.

Le DIM qui capture tous les détails pertinents serait comme ..

create table DIM_INSTRUCTOR(
    instr_guid number, --populated through a sequence  -----Composite pk-Part1 
    istr_oid number, --direct id from the OLTP system -----cmposite pk-part2 
    instr_name number, 
    other_attr varchar2(25), 
    eff_date date, 
    expiration_date date 
); 

instr_guid est généré directement à partir d'une séquence et est indépendante du système OLTP.

Cela vous permettrait de capturer tous les détails pour un instructeur donné. Vous pouvez utiliser simplement instr_guid comme clé étrangère à la table de faits, mais les inclure tous les deux (instr_guid, instr_guid) augmenterait la facilité d'interrogation ... ce qui est l'un des objectifs de Datawarehousing.

Liens utiles:

http://en.wikipedia.org/wiki/Surrogate_key http://en.wikipedia.org/wiki/Slowly_changing_dimension#Type_2

+0

Merci pour cela. Comment procéder pour référencer la clé d'une autre table de dimension? La table DimLessons contient donc toutes les leçons pour un instructeur particulier. La table des leçons fonctionne de la même manière, en utilisant le type 2. – Paul

+0

Les tables de dimension ne sont (généralement) pas supposées se référencer mutuellement. Ce sont toutes des entités indépendantes et c'est la table de faits qui fait référence à ces tables. D'après ce que je comprends, votre scénario aurait une inscription de classe au niveau factuel. Chaque inscription de classe serait un enregistrement dans la table de faits. Students_dim, instructors_dim, classes_dim contiendra les attributs correspondants. Le paramètre enrollment_fact contiendrait les clés de chacune de ces tables et tous les autres détails tels que enrolllment_date et ainsi de suite. –

+0

Je pense que je comprends. Donc, si je veux créer le schéma basé sur des instructeurs, des étudiants, des leçons et des réservations de leçons, chacune des tables d'ombrage (instructeurs, étudiants, leçons) serait indépendante l'une de l'autre et relierait via la table de faits? Cela aurait du sens, mais que se passe-t-il si un rapport a été généré affichant les leçons d'un instructeur auquel personne n'a participé? Comment lier un instructeur à une leçon s'il n'y a aucun enregistrement dans la table de faits, car personne n'a participé? – Paul

0

Utilisez un guid/UUID comme la clé primaire ou une combinaison de colonnes

+0

Vous voulez dire le InstructorDWID? Cette valeur sera unique car c'est une colonne d'identité. Cependant, si les détails de l'instructeur changent, l'instructeur aura plus d'un instructeurDWID. Exemple - InstructorDWID est actuellement 1, puis l'instructeur change son titre de Miss à Mme Nous avons maintenant InstructorDWID de 1 et 2. 1 est maintenant obsolète et 2 est en cours. Qu'advient-il des leçons qui référencent InstructorDWID 1 maintenant qu'il est obsolète? – Paul

2

Ce que vous décrivez ici est habituellement appelée dimension de type 2. Les livres d'entrepôts de données de Kimball ont des sections entières sur les dimensions de type 2 et des ETL pour le type - à lire.

La première chose à comprendre est la différence entre la clé primaire et la clé métier. La clé primaire identifie de manière unique une ligne dans la table, tandis que la clé métier identifie de manière unique une entité décrite dans la table, comme un instructeur.Par exemple, si un instructeur change de nom, la table dimInstructor peut ressembler à:

InstructorKey InstructorBusinessKey FirstName LastName row_ValidFrom row_ValidTo row_Status 
    1234   jane_doe_7211   Jane  Doe  2000-03-11 2010-08-12  expired 
    7268   jane_doe_7211   Jane  Smith  2010-08-12 3000-01-01  current 

Maintenant, à condition que le dimLesson est une conception appropriée pour votre modèle d'entreprise (plutôt que d'avoir une sorte de fait) la dimLesson aurait une colonne appelée InstructorKey. Au cours du processus ETL, lors de la distribution de la nouvelle ligne (7258) au tableau dimInstructor, remplacez toutes les références à la ligne 1234 dans le dimLesson par 7268.

+0

Merci Damir. La table dimLesson sera similaire à la table dimInstructor. Un exemple de rapport peut être basé sur l'augmentation ou la diminution des réservations de cours après que la leçon a changé de nom? Je pense que la méthode que vous avez expliquée semble la plus logique. – Paul