表与其他表的关系,如果其他表相关,我应该只加一个表

时间:2012-11-11 06:02:55

标签: database normalization

我有4张表:

tbl_users
tbl_college
tbl_courses
tbl_sections

tbl_users当然包含usernamepassword

如果我想获取有关某个用户的所有信息,包括:

,该怎么办?
  1. 他/她属于哪所大学(例如工程学院工商管理学院

  2. 他/她正在学习什么课程(例如土木工程科学学士市场营销科学学士

  3. 他/她进入的部分(例如 CBC ITED

  4. 如果tbl_courses设置如下:

    tbl_courses (id, course_name, college_id)
    

    其中college_id是指tbl_college.id

    和tbl_sections设置如下:

    tbl_sections(id, section_name, course_id)
    

    其中course_id是指tbl_course.id

    我该怎么做才能选择与用户相关的所有信息,在这种情况下,这些信息包含usernamepasswordcollege,{ {1}},course

    我的想法是我可以创建另一个表:section,如下所示:

    tbl_user_section

    这样我就可以拥有一张表,其中包含哪些部分。另外,在我看来,我可以轻松地进行连接以获取相关信息:

     CREATE TABLE tbl_user_section (user_id INTEGER NOT NULL, section_id INTEGER NOT NULL,
     FOREIGN KEY user_id REFERENCES users(id),
     FOREIGN KEY section_id REFERENCES sections(id))
    

    我最近遇到的这种设置问题是,如果用户尚未进入某个部分,当我尝试使用上述代码查询所有用户时,将不会选择该用户,否则不会显示。< / p>

    同样通过这种设置我可以做到这一点

    SELECT tbl_users.username, tbl_sections.section_name FROM tbl_users 
    INNER JOIN tbl_user_section ON tbl_users.id = tbl_user_section.user_id 
    INNER JOIN tbl_sections ON tbl_sections.id = tbl_user_section.section_id
    

    获取查询中包含的信息。

    在您看来,您从我创建的设置中可以看到哪些其他问题?

    在`tbl_users中只有SELECT tbl_users.username, tbl_sections.section_name, tbl_courses.course_name, tbl_colleges.college_name FROM tbl_users INNER JOIN tbl_user_section ON tbl_users.id = tbl_user_section.user_id INNER JOIN tbl_sections ON tbl_sections.id = tbl_user_section.section_id INNER JOIN tbl_courses ON tbl_courses.id = tbl_sections.course_id INNER JOIN tbl_colleges ON tbl_college.id = tbl_courses.college_id 字段而不是像我一样创建一个单独的表是明智的吗?

    如果我有类型的用户,我应该做同样的事情(将用户类型的表分开)并拥有section_id或者只是将它们放在同一个表中tbl_user_type

    假设这是一个大项目,你会选择什么?

1 个答案:

答案 0 :(得分:2)

如果您因为一个或多个表中缺少某个用户而无法显示,则可以使用OUTER JOIN显示这些用户,并且列中的NULL值将来自那些表。因此,没有section的学生将获得section_name的NULL值,但仍保留所有其他信息。