2010-07-02 2 views
1

Système existant - J'ai des tables Utilisateurs et Tutor_Details dans mon système. - Il existe deux types d'utilisateurs: les tuteurs et les étudiants. Les tables Users et Tutor_Details sont liées par la clé étrangère id_user.Suggestion d'architecture de table Mysql requise

Nouvelle exigence - Chaque tuteur peut avoir quelques-unes des informations d'identification suivantes: -

Certified 
Experienced 
Other 

Un tuteur peut avoir un maximum de 3 et 1 minimum des titres de compétences pour l'instant. Pour chaque accréditation spécifiée, le tuteur peut également ajouter une description.

Actuellement, il y a 3 informations d'identification, mais plus tard, il peut y en avoir plus.

Quelle serait la meilleure façon de stocker les informations d'identification. Les tuteurs peuvent être recherchés par des informations d'identification. Lors de la visualisation des détails d'un tuteur, tous ses identifiants doivent être affichés.

Je pensais à la structure suivante: -

Une nouvelle table de vérification des pouvoirs comme-

CREATE TABLE IF NOT EXISTS `Credentials` (
    `id_credential` int(10) unsigned NOT NULL auto_increment, 
    `credential` varchar(255) default NULL, 
    PRIMARY KEY (`id_credential`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ; 

INSERT INTO `Credentials` (`id_credential`, `credential`) VALUES 
(1, 'Certified'), 
(2, 'Experienced'), 
(3, 'Recent Student'), 
(4, 'Other'); 

Si de nouvelles références sont ajoutées par la suite, ils sont définis ici.

Et une nouvelle table de Tutor_credential_map qui contiendra un enregistrement pour chaque lettres de créance d'un tuteur

CREATE TABLE IF NOT EXISTS `Tutor_Credential_map` (
    `id` int(10) NOT NULL auto_increment, 
    `id_tutor` int(10) NOT NULL, 
    `id_credential` int(10) NOT NULL, 
    `description` varchar(255) NOT NULL default '', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 

Cela rend les choses faciles pour le point de vue de l'entretien, mais si je veux aller chercher toutes les informations de Tutor stockées dans Table Tutor_Details avec toutes ses informations d'identification dans une seule requête J'ai autant d'ensembles de résultats pour un tuteur qu'il y a d'informations d'identification. Cette requête: -

select td.id_tutor, tcrm.* from Tutor_Details as td inner join Users as u on td.id_user = u.id_user join Tutor_Credential_map as tcrm on td.id_tutor = tcrm.id_tutor join Credentials as cr on tcrm.id_credential = cr.id_credential where td.id_tutor = 23 

Toute idée de garder les tables séparées, ainsi que chercher un détail unique tuteur dossier pour chaque tuteur avec toutes les informations de références? Ou y a-t-il un meilleur moyen?

Merci

Répondre

3

C'est la nature de SQL JOIN que plusieurs lignes sont renvoyées pour chaque matchs des titres de compétences.La manière la plus simple de gérer cela serait de traiter en dehors de MySQL en utilisant le système de lanuguage/système que vous utilisez pour lancer la requête en premier lieu. Pour autant que je sache, votre structure est très bien!

0

Vous avez dit « Il y a deux types d'utilisateurs -. Les tuteurs et les étudiants des utilisateurs et des tables de Tutor_Details sont reliés par id_user clé étrangère ».
Peut-il y avoir plusieurs tuteurs par utilisateur, je ne crois pas. Aussi un utilisateur peut être un tuteur et un étudiant.
Si dans les deux cas ci-dessus la réponse est "no" je suggère "User_Credential_map" au lieu de "Tutor_Credential_map". id_tutor peut être id_user.

 
    CREATE TABLE IF NOT EXISTS `User_Credential_map` ( 
     `id` int(10) NOT NULL auto_increment, 
     `id_user` int(10) NOT NULL, 
     `id_credential` int(10) NOT NULL, 
     `description` varchar(255) NOT NULL default '', 
     PRIMARY KEY (`id`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 

Maintenant, pour répondre à votre question sur la base des obesrvations ci-dessus.

 
    SELECT 
     Users.*, 
     Tutor_Details.* , 
     User_Credential_map.* , 
     Credentials.* 
    FROM 
     Users, 
     Tutor_Details, 
     User_Credential_map, 
     Credentials 
    WHERE 
     Tutor_Details.id_tutor = 23 
     AND Tutor_Details.id_user = Users.id_user 
     AND Tutor_Details.id_credential = Credentials.id_credential