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)
这就是数据库规范化的工作原理.
| 归档时间: |
|
| 查看次数: |
461 次 |
| 最近记录: |