2014-07-21 6 views
1

Tout d'abord, permettez-moi de dire que je suis toujours un expert dans ce domaine de la base de données du monde réel, et j'espérais avoir un peu de lumière sur cette situation.Relations avec les bases de données SQL

J'ai récemment mis en place une application Web asp de base pour gérer une base de données SQL avec deux tables. Les tableaux sont les suivants:

Table clé:

KEY_ID Key_desc key_number Key_location Issued_by emp_id

Table Emp:

emp_id emp_fname emp_lname Emp_phone

Comme vous pouvez le voir, les tables sont liées par le champ emp_id. Cependant, la table de clé permet des valeurs nulles dans la colonne emp_id au cas où la clé n'est pas affectée à un employé. Étant donné que c'est le cas, je suis préoccupé par la relation globale dans la base de données, et les enregistrements orphelins deviennent une préoccupation.

Puisque la table de clé tient compte des valeurs nulles pour cette colonne, est-ce que cela signifie qu'elle n'est pas dans 1NF? Pour l'instant, l'application Web attribue des clés en extrayant tous les enregistrements de la table de clés en sélectionnant tous les enregistrements où emp_id est vide, puis en attribuant un emp_id à une clé sélectionnée. Mais la relation n'existe que si la clé a un employé associé, et il semble qu'il doit y avoir une meilleure façon de le faire.

Il est probablement un peu tard pour changer l'application, donc je demande plus ou moins par pure curiosité. Je pensais avoir besoin d'une table de touches assignée et d'une table de touches non affectées, mais je ne sais pas comment les lier avec les champs de base de données actuels. Quelqu'un peut-il me donner un conseil à ce sujet? Ou peut-être m'aider à trouver un meilleur moyen de relier la base de données ensemble?

Ma principale préoccupation est les dossiers orphelins

Cela a été dactylographié sur un mobile, alors s'il vous plaît pardonnez-moi s'il y a des erreurs. EDIT: Merci beaucoup à ceux qui ont répondu à cette question. J'ai reçu plus d'aide que je ne le pensais. Je marquerai une réponse plus tard, quand je découvrirai quelle route prendre.

Quelque chose m'a dit que c'était le bon endroit pour demander.

+0

Y a-t-il une clé étrangère de "Table de touches" à "Table d'application"? –

+0

Mike Sherill: La seule relation pour le moment est le champ emp_id qui est la clé étrangère dans la table des clés (clé primaire dans emp_tbl). Je ne pouvais pas vraiment penser à une meilleure façon de les lier ensemble. – user3860870

+0

Une «clé» est une chose avec laquelle vous ouvrez une porte? –

Répondre

1

Une alternative est de créer une troisième table, de noter les affectations de touches. Si une clé n'est pas affectée, ne mettez pas de ligne dans cette table. Ne mettez pas une clé étrangère emp_id dans la table des clés.

Exemple en ce qui concerne votre question dans les commentaires:

CREATE TABLE KeyAssignment (
    key_id INT PRIMARY KEY, 
    emp_id INT NOT NULL, 
    FOREIGN KEY (key_id) REFERENCES keys (key_id), 
    FOREIGN KEY (emp_id) REFERENCES emp (emp_id) 
); 

Aucun autre attributs sont nécessaires, parce que tous les détails des deux clés et les employés sont déjà stockés dans les autres tableaux.

Notez que le tableau ci-dessus n'est pas exactement une table plusieurs-à-plusieurs, car key_id seul est la clé primaire. Vous ne pouvez avoir qu'une (ou zéro) ligne pour chaque key_id. Si vous avez une ligne pour un key_id donné, emp_id n'est pas NULL donc une affectation est obligatoire. Les clés non affectées n'ont simplement pas de ligne dans cette table (jusqu'à ce qu'elles soient assignées).

En ce qui concerne si votre conception originale est en 1NF, oui, la plupart du temps, il est d'accord. La valeur d'un Emp_id non nul est une valeur unique du domaine des employés, et c'est ce qui est requis pour 1NF.

SQL a la règle supplémentaire que NULL peut être considéré comme un membre virtuel de n'importe quel domaine, bien que cette règle soit compatible avec la théorie relationnelle est controversial. C.J. Date fait valoir que le concept de la NULL dans SQL est incompatible avec la théorie relationnelle. Mais E.F. Codd a reconnu l'importance d'un NULL, pour signifier que le membre d'une rangée est inapplicable ou inconnu.

+0

Merci pour ça. J'ai pensé à ajouter une table d'affectation, mais je ne savais pas quels champs j'y inclurais.Ni comment cela se rapporterait aux deux tables existantes. Pourriez-vous me donner une sorte d'exemple de syntaxe de la table d'affectation possible? Ou quels domaines je pourrais inclure? .. J'hésite à changer le design si je n'ai pas vraiment besoin de le faire, mais des éclaircissements sur celui-ci seraient utiles. – user3860870

+0

@ user3860870 Chaque table (résultat de base ou de requête) contient les lignes qui rendent true une déclaration de fill-in-the-blanks. Par exemple, "la clé [k] est assignée à l'employé [e]". Trouvez les instructions/tableaux pour décrire vos situations d'application. NULL n'est jamais nécessaire. Cela complique les déclarations et les requêtes. Mais pour un SGBD SQL, NULL peut améliorer les performances et simplifier les contraintes. La théorie de normalisation ne permet pas NULL. Mais raisonner sur NULL comme une valeur supplémentaire pour n'importe quelle colonne permet de raisonner sur la normalisation. Mais ce n'est pas comme les autres valeurs car les opérateurs SQL et les opérateurs logiques le traitent différemment. – philipxy

0

Je pense que la conception de DB que vous cherchez est quelque chose comme ce qui suit (en utilisant la syntaxe MySQL):

create table Emp(
    Emp_ID int not null auto_increment PRIMARY KEY, 
    LastName varchar(30), 
    FirsName varchar(20), 
    Phone varchar(20) 
); 

create table `Key`(
    Key_id int not null auto_increment PRIMARY KEY, 
    Description varchar(255), 
    Key_number int, 
    Key_location int, -- or your data type for this column 
    Issued_by int -- or your data type for this column 
    Emp_id int, -- foreign key to Emp table 
    FOREIGN KEY (Emp_id) references Emp(Emp_ID) 
    ON DELETE CASCADE -- or RESTRICT/NO ACTION options -- see notes below 
); 

Trois points supplémentaires:

1) Vous pouvez également utiliser les LIMITER/NO Options d'action pour empêcher la suppression de la ligne de clé primaire.

2) Évitez d'utiliser des mots réservés pour les noms de table ou de colonne, par exemple Key.

3) Je préfère ne pas préfixer les noms de colonne avec le nom de la table, ex. Emp_lname. C'est redondant et moins lisible.

EDIT Comme par @Hugh Jones, je sépare les colonnes Issued_by et emp_id - Merci Hugh

+0

J'ai lu 'issued_by' &' emp_id' comme 2 champs –

+0

Maintenant que je regarde de plus près, vous avez raison - ce sont des champs séparés. Je vais éditer la réponse. –

+0

@rob tornambe: en ce qui concerne le design, c'est peut-être ce que je cherchais. Je dois mentionner que je n'ai pas créé les tables à l'origine, j'ai seulement construit une application web pour travailler avec les existantes. Je pensais à les redessiner, et c'est là que cela sera utile. Je vais probablement modifier les noms de colonnes pour éviter la redondance. Je ne suis pas familier avec la restriction/pas d'action ... Je dois demander, ce qui se passerait si je devais essayer et supprimer une clé qui a été assignée à un employé, de la table de clé? ... ne supprimerait-il rien ? – user3860870

Questions connexes