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

标签 c# database database-design oledb

我正在为学校的 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/

相关文章:

database - 规范化的类设计是否会导致规范化的数据库设计

php - MYSQL表规划

c# - asp.net core TestServer找不到配置

database - 可空外键会违反什么范式?

c# - 用于向 Web 服务发出 http post 请求的多线程

asp.net - 如何将XML文件转换成DataSource?

c# - 添加对象时 TransactionContext 有什么区别?

c# - 使用 Linq to sql 将 List<String> 插入到 ntext 字段

c# - 为什么我的 ActionBlock 在我没有设置的情况下就处于已完成状态?

c# - 是否有可用的 C# 面部识别库?