我正在为学校的 C# 应用程序创建一个 Access 数据库。我没有太多使用 DB 的经验,所以如果这听起来很愚蠢,请忽略它。我希望用户能够选择某个学生在我们 IT 部门上过的所有类(class)。我们总共有大约 30 个,一个人在高中 4 年最多可以上 15 个。现在我的数据库有 15 个不同的列,用于用户可以拥有的每个类(class)。我怎样才能将它压缩到一列(如果有办法的话)?
最佳答案
卢卡斯问得好,这深入探讨了数据库规范化的行为。
您认识到为什么用多个列来表示类是不好的这一事实已经表明您有很大的潜力。
如果我们想添加一个新类怎么办?现在我们必须添加一个全新的列。这几乎没有灵 active 。
那么可以做什么呢?
我们创建了三个表。
一张 table 是给学生的:
Student
|-------------------------|
| StudentID | Student_Name|
|-------------------------|
| 1 | John |
| 2 | Sally |
| 3 | Stan |
---------------------------
一张表用于类:
Class
------------------------
| ClassID | Class_Name|
------------------------
| 1 | Math |
| 2 | Physics |
------------------------
最后,一张表保存了 Students 和 Classes 之间的关系:
Student_Class
-----------------------
| StudentID | ClassID |
-----------------------
如果我们想让 John 学习物理,我们会在 Student_Class 表中插入一行。
INSERT INTO Student_Class (StudentID, ClassID) VALUES (1, 2);
现在,我们有记录表明学生 #1 (John) 正在上课 #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);
为了以可读的方式提取数据,我们将三个表连接在一起:
SELECT Student.Student_Name,
Class.Class_Name
FROM Student,
Class,
Student_Class
WHERE Student.StudentID = Student_Class.StudentID
AND Class.ClassID = Student_Class.ClassID;
这会给我们这样的结果集:
------------------------------
| Student_Name | Class_Name |
------------------------------
| John | Physics |
| Sally | Math |
| Stan | Physics |
| Stan | Math |
------------------------------
简而言之,这就是数据库规范化的工作原理。
关于c# - 如何摆脱数据库中的多个列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/731902/