1

所以,昨天我问了两个围绕同一个想法的问题:重组一个 A- 没有标准化的数据库,B- 由于我的无知而一团糟。我花了一天的大部分时间来整理我的想法,阅读并完成一些测试。今天,我认为我对我的数据库的外观和行为有了更好的了解,但我想确保我理解正确的 SQL 数据库设计和规范化过程的核心思想。

最初,我有一个名为“Files”的表,其中包含有关文件的数据(它的 URL、上传日期、上传文件的用户 ID 等)以及一个名为“grades”的列,表示您可能使用该文件的年级水平为了。(仅供参考:这些文件是学校的课程计划)我意识到我违反了关于规范化的规则 #1 - 我将我的“成绩”存储为“1,2”或“2,6”或“3,5,6” “在一栏中。如果我想查看 JUST 3 年级课程或 JUST 5 年级课程,这在尝试解析这些数据时会引起很大的麻烦。

向我提出的建议,后来变得明显的是,我有 3 张桌子:

文件(有关文件、网址等的数据)等级(可用年级表。可能从 1-6 开始) files_grades(连接表)

这是有道理的,。我只是想确保在我做之前我明白我在做什么。假设用户 A 上传了文件 xyz,并认为它适合 2 年级和 3 年级。

我会将一条记录写入“文件”表,其中包含有关该文件的数据(kb 大小、url、描述、名称、主键 files_id)。假设它的 id 为 345。

由于等级选项的数量有限,等级可能与他们的 ID 相同(即,等级 1 是 Grades_id 1,等级 2 是 Grades_id 2)

然后我将两条记录写入“files_grade”连接表,其中包含

files_grade_id、files_id 和 Grades_id 即

1,345,2

1,345,3

代表 files_id 345 适合的 2 个等级。然后我挥动我的魔法 SELECT 和 JOIN 魔杖并提取我需要的数据。

这有意义吗?我是否再次误解了关系多对多数据库的正确结构?

我刚刚想到的问题 2:所以,一堂课可以有多个“成绩”。没问题,我们刚刚解决了这个问题(我希望!)。但从理论上讲,它也可以有多个“学校”——小学、中学、高中。如果文件条目的中、高等级为 1,2,我们该怎么办?这可以很容易地通过说“每个文件一个学校,用户!”来解决,但我喜欢把它扔在那里。

4

3 回答 3

1

然后我将两条记录写入“files_grade”连接表,其中包含

files_grade_id、files_id 和 Grades_id 即

这里的files_grade_id是多余的,因为files_idGrades_id的组合已经是唯一的(因此可以设置为主键)。

但从理论上讲,它也可以有多个“学校”——小学、中学、高中。如果文件条目的中、高等级为 1,2,我们该怎么办?

根据您的要求,您也许可以将这些存储为以前等级的“延续”,例如 1-6 小学、7-9 中、10-12 高。然后你可以完全不用成绩表(因为你可以把这些数字存储在files_grade表中)。

于 2010-02-19T02:40:12.723 回答
0

由于您的第一个问题已经得到解答,我将尝试第二个问题。

有多种方法可以做到这一点,但一种可能性是为“学校”添加另一个表,并将其作为连接表的一部分 - 当然重命名连接表以匹配新设计。所以,你可以有:

School Table:

-------------------------
  SchoolId  |   School  
-------------------------
     1      | Elementary
     2      | Middle
     3      | High
-------------------------

Files_grades_school

------------------------------------
  FileId  |   GradeId  |  SchoolId 
------------------------------------
    345   |      1     |      1
    345   |      1     |      2

您可能希望根据您的使用模式创建多个索引。

于 2010-02-19T03:41:25.697 回答
0

从它的声音来看,它听起来很不错。不过,只有一件事:您实际上并不需要桥表 (FILES_GRADES) 的 ID,如果有,则需要增加 ID。

您将有一个由两部分组成的主键:grade_id 和 file_id,files_grade_id 只会使事情复杂化,并且会导致索引错误,因为您永远不会在选择中使用它。

于 2010-02-19T02:32:51.717 回答