Question

J'ai trois tables dénormalisées que je dois prendre à leur valeur nominale (les données proviennent de certaines ressources externes). Les trois tableaux ont des définitions différentes, mais ils décrivent chacun le même objet sous différents angles.

   object1  A  B
   object2  A
   object3     B  C
   object4        C

Le seul point commun entre ces tables est leur clé primaire. Je peux corral les ID ensemble en utilisant SELECT UNION SELECT, mais la requête semble relativement lente, même si chaque table a son champ de PK indexé. Je pourrais créer une vue abstraite de cette requête, vw_object_ids, mais il effectue à la même vitesse. Je pensais que je pourrais ajouter un index pour matérialiser la vue, mais dans SQL Server 2005, vous ne pouvez pas vues d'index avec les partenaires sociaux.

Ce que je veux est d'avoir un index principal d'ID soit en phase avec les données sous-jacentes, qui peuvent se mis à jour ou supprimés chaque fois. Je suppose que je pourrais y arriver indéfiniment avec un ensemble fou de déclencheurs ou tout simplement se contenter de la vitesse de la vue non indexée. Mais je voulais juste vous assurer que je ne manque aucune option ou si ce scénario a un nom ou est indicatif d'un motif.

Pensées

Était-ce utile?

La solution

Créer une table de maître qui ne contient que l'ID:

CREATE TABLE master (ID INT NOT NULL PRIMARY KEY)

et font les trois tables de se référer à cette table de maître avec ON DELETE CASCADE.

Pour remplir la table pour la première fois, l'émission

INSERT
INTO    master
SELECT  id
FROM    a
UNION
SELECT  id
FROM    b
UNION
SELECT  id
FROM    c

Pour remplir le tableau sur une base régulière, créer un déclencheur sur chacun des trois tables.

Ce déclencheur devrait essayer d'insérer la nouvelle ID à master et faillir en silence sur la violation de PRIMARY KEY.

Pour interroger, utilisez:

SELECT  *
FROM    master m
LEFT OUTER JOIN
        a
ON      a.id = m.id
LEFT OUTER JOIN
        b
ON      b.id = m.id
LEFT OUTER JOIN
        c
ON      c.id = m.id

utilisera efficienty indexe.

Pour supprimer, utilisez:

DELETE
FROM    master
WHERE   id = @id

Cela ouvrira ON DELETE CASCADE et supprimer des enregistrements des trois tableaux le cas échéant.

Autres conseils

Pourquoi ne pas simplement faire une jointure externe puis fusionner les colonnes des tables de composants?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top