Comment puis-je (rapidement) cotejo ID de différentes tables?
-
22-08-2019 - |
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
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?