2008-11-10 16 views
2

J'ai une grande base de données d'accès que j'ai besoin de normaliser en cinq tables et une table de recherche. Je comprends la théorie derrière la normalisation et ai déjà esquissé l'aspect des tables mais je suis perdu sur comment transformer ma table pour obtenir la base de données normalisée. Les analyseurs de table n'offrent pas la ventilation que je veux.Normaliser une base de données MS Access existante

Répondre

0

Les requêtes, en particulier les requêtes Union, offrent-elles une solution? Où voyez-vous un problème?

+0

Jamais considéré comme une requête d'union. Je ne suis pas au courant des étapes nécessaires pour garder les relations intactes après avoir séparé la table. –

0

La base de données est une base de données assez typique sans rien de spécial pour la distinguer des autres.

La base de données se compose d'une table avec:

nom de la société, addess, téléphone, etc. personne de contact avec les domaines connexes typiques

Cela servira essentiellement en tant que base de données marketing et je besoin de garder suivi d'événements, correspondance commerciale et autres. Je suis juste perdu sur la façon de garder les relations intactes.

0

Voulez-vous dire les relations dans la fenêtre des relations? Ceux-ci peuvent facilement être reconstruits. Ou voulez-vous dire les champs clés, etc? Cela peut parfois être difficile et peut impliquer des tableaux intermédiaires. Chaque cas est différent. Comme l'a dit doofledorfer, vous aurez probablement plus de conseils spécifiques si vous postez des schémas.

5

Si vous avez une seule table, ajoutez-y un champ Autonumber.

Créez ensuite vos autres tables et utilisez la valeur Autonumber de la table unique d'origine comme clé étrangère pour les relier aux données d'origine.

Si vous aviez tblPerson:

tblPerson 
    LastName, FirstName, WorkPhone, HomePhone 

et que vous vouliez décomposer, ajouter PersonID autonumber puis créer une table de téléphone:

tblPhone 
    PhoneID, PersonID, PhoneNumber, Type 

alors vous ajouter des données de tblPerson pour les champs appropriés:

INSERT INTO tblPhone (PersonID, PhoneNumber, Type) 
    SELECT tblPerson.PersonID, tblPerson.WorkPhone, "Work" 
    FROM tblPerson 
    WHERE tblPerson.WorkPhone Is Not Null; 

puis de lancer une autre requête pour le téléphone résidentiel:

INSERT INTO tblPhone (PersonID, PhoneNumber, Type) 
    SELECT tblPerson.PersonID, tblPerson.HomePhone, "Home" 
    FROM tblPerson 
    WHERE tblPerson.HomePhone Is Not Null; 

Quelqu'un a suggéré une requête UNION, que vous auriez à enregistrer en tant que vous ne pouvez pas avoir une requête UNION comme subselect dans Jet SQL. La requête enregistrée ressemblerait à quelque chose comme ceci:

SELECT tblPerson.PersonID, tblPerson.WorkPhone, "Work" As Type 
    FROM tblPerson 
    WHERE tblPerson.WorkPhone Is Not Null 
    UNION ALL 
    SELECT tblPerson.PersonID, tblPerson.HomePhone, "Home" As Type 
    FROM tblPerson 
    WHERE tblPerson.HomePhone Is Not Null; 

Si vous avez enregistré que qryPhones, vous auriez alors ajoutez qryPhones avec ce SQL:

INSERT INTO tblPhone (PersonID, PhoneNumber, Type) 
    SELECT qryPhones.PersonID, qryPhones.WorkPhone, qryPhones.Type 
    FROM qryPhones; 

De toute évidence, ce n'est que l'exemple le plus simple. Tu ferais la même chose pour tous les champs. La clé est que vous devez créer une valeur PK pour votre table source qui liera tous les enregistrements dérivés à la table d'origine.

+1

Ceci est une réponse excellente et bien détaillée. J'aimerais pouvoir voter plus d'une fois! –

+0

@David W.Fenton: "vous ne pouvez pas avoir une requête UNION en tant que sous-sélection dans Jet SQL" - incorrect. Essayez ceci en utilisant Northwind en mode de requête ANSI-92: 'SELECT DT1.digit FROM (SELECT DISTINCT 1 AS Digit FROM Commandes UNION SELECT DISTINCT 2 FROM Commandes) AS DT1;' – onedaywhen

Questions connexes