如何摆脱数据库中的多个列?

Kre*_*dns 5 c# database oledb database-design

我正在创建一个Access DB,用于学校的C#应用​​程序.我没有太多使用DB的经验,所以如果这听起来很愚蠢就会忽略它.我希望用户能够选择某个学生在我们IT部门拥有的所有课程.我们总共有大约30个,一个人在4年高中时可以拿到的最大值是15.现在我的DB有15个不同的列,每个用户可以拥有一个类.如何将其压缩到一列(如果有方法)?

Fly*_*wat 18

优秀的问题Lucas,这深入研究了数据库规范化的行为.

您已经认识到为什么有多个列来表示类的事实已经很糟糕,这表明您有很大的潜力.

如果我们想添加一个新类怎么办?现在我们必须添加一个全新的列.这方面几乎没有灵活性.

那可以做些什么呢?

我们创建三个表.

一张桌子供学生使用:

Student
   |-------------------------|
   | StudentID | Student_Name|
   |-------------------------|
   |     1     |     John    |
   |     2     |     Sally   | 
   |     3     |     Stan    | 
   ---------------------------
Run Code Online (Sandbox Code Playgroud)

一个表用于类:

Class
   ------------------------
   | ClassID  | Class_Name|
   ------------------------
   |    1     |   Math    |
   |    2     |   Physics |
   ------------------------
Run Code Online (Sandbox Code Playgroud)

最后,一个表格包含学生和班级之间的关系:

Student_Class
   -----------------------
   | StudentID | ClassID |
   -----------------------
Run Code Online (Sandbox Code Playgroud)

如果我们想将John注册到Physics中,我们会在Student_Class表中插入一行.

  INSERT INTO Student_Class (StudentID, ClassID) VALUES (1, 2);
Run Code Online (Sandbox Code Playgroud)

现在,我们有一个记录说学生#1(约翰)正在参加2级(物理).让Sally参加数学,Stan参加物理和数学.

  INSERT INTO Student_Class (StudentID, ClassID) VALUES (2, 1);
  INSERT INTO Student_Class (StudentID, ClassID) VALUES (3, 1);
  INSERT INTO Student_Class (StudentID, ClassID) VALUES (3, 2);
Run Code Online (Sandbox Code Playgroud)

为了以可读的方式提取数据,我们将三个表连接在一起:

  SELECT Student.Student_Name, 
         Class.Class_Name 
  FROM Student, 
       Class, 
       Student_Class 
  WHERE Student.StudentID = Student_Class.StudentID 
       AND Class.ClassID = Student_Class.ClassID;
Run Code Online (Sandbox Code Playgroud)

这会给我们一个这样的结果集:

  ------------------------------
  | Student_Name  | Class_Name |
  ------------------------------
  |    John       |  Physics   |
  |    Sally      |   Math     |
  |    Stan       |  Physics   |
  |    Stan       |   Math     |
  ------------------------------
Run Code Online (Sandbox Code Playgroud)

这就是数据库规范化的工作原理.