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
Les requêtes, en particulier les requêtes Union, offrent-elles une solution? Où voyez-vous un problème?
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.
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.
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.
Ceci est une réponse excellente et bien détaillée. J'aimerais pouvoir voter plus d'une fois! –
@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
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. –