所以,昨天我问了两个围绕同一个想法的问题:重组一个 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,我们该怎么办?这可以很容易地通过说“每个文件一个学校,用户!”来解决,但我喜欢把它扔在那里。