2010-07-02 139 views
1

現有系統 - 我有我的系統中現有的用戶和Tutor_Details表。 - 有兩種類型的用戶 - 導師和學生。用戶和Tutor_Details表由id_user外鍵鏈接。Mysql表體系結構建議需要

新要求 - 每個導師可以有以下一些憑據: -

Certified 
Experienced 
Other 

的導師最多可有3個和最小1個憑據了。對於指定的每個憑證,導師也可以添加一些說明。

現在有3個憑證,但稍後可能會有更多。

什麼是存儲憑據信息的最佳方式。可以通過憑證搜索導師。在查看輔導員詳細信息時,應顯示其所有憑據。

我在想下面的結構: -

一個新的證書表喜歡 -

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'); 

如果新的證書以後添加,他們在這裏定義。

一新Tutor_credential_map表,該表將包含一個記錄導師

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 ; 

這使事情變得容易的觀點維修點的每一個憑證,但如果我想獲取所有的教師信息存儲在Tutor_Details表及其所有憑證在一個查詢中我獲得了許多導師的結果集,因爲他們有證書。這個查詢: -

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 

任何想法,以保持單獨的表以及取一個導師細節記錄與所有的憑據信息每位教師?或者,還有更好的方法?

感謝

回答

3

這是SQL的性質JOIN多個行會爲每個憑據匹配返回。

處理這個問題的最簡單方法是使用您正在使用的任何語言/系統首先運行查詢的MySQL之外的處理。

據我所知,你的結構很好!

0

你說:「有兩種類型的用戶 - 通過id_user外鍵鏈接教師和學生用戶和Tutor_Details表」。
每個用戶可以有多個導師,我不相信。用戶也可以是導師和學生。
如果在上述兩種情況下的答案是「no」我建議「User_Credential_map」而不是「Tutor_Credential_map」。 id_tutor可以是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 ; 

我們基於上述obesrvations回答你的問題。

 
    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