需要Mysql表架构建议

时间:2010-07-02 10:32:34

标签: mysql database-design

现有系统 - 我的系统中有现有的Users和Tutor_Details表。 - 有两种类型的用户 - 导师和学生。用户和Tutor_Details表由id_user外键链接。

新要求 - 每位导师都可以获得以下一些证书: -

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表中的所有Tutor信息以及他在单个查询中的所有凭据,我会获得尽可能多的导师结果集。此查询: -

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

是否有任何想法保留单独的表格以及为每位导师提取所有凭据信息的单个导师详细记录?或者有更好的方法吗?

由于

2 个答案:

答案 0 :(得分:3)

SQL JOIN的本质是每个凭证匹配都会返回多行。

处理此问题的最简单方法是使用您使用的任何语言/系统在MySQL之外进行处理,以便首先运行查询。

据我所知,你的结构很好!

答案 1 :(得分:0)

你说“有两种类型的用户 - 导师和学生。用户和Tutor_Details表由id_user外键链接”。
每个用户可以有多个导师,我相信不是。用户也可以是导师和学生。
如果在上述两种情况下答案都是“没有”,我建议使用“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 ; 

现在根据上述观点回答你的问题。

    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