2010-02-19 62 views
1

因此,昨天我问了两个围绕着同样想法的问题:重组一个数据库,使A-没有正常化,B-由于我的无知而变得混乱。我花了一整天的时间来组织我的想法,阅读并通过一些测试。今天,我认为我对DB的外观和行为有了更好的理解,但我想确保理解正确的SQL DB设计和规范化过程的核心思想。这个数据库结构是否理智,正确和规范化?

本来我有一个名为“文件”的表格,它包含关于文件的数据(它是URL,上传日期,谁上传它的用户ID等)以及一个名为“成绩”可能会使用该文件。 (仅供参考:这些文件是学校的教案)我意识到我违反了关于规范化的规则#1 - 我存储了像“1,2”或“2,6”或“3,5,6”这样的“等级” “在一列中。如果我想看到JUST 3年级的课程或JUST 5年级的课程,这在试图解析数据时造成了很大的麻烦。

什么建议给我,后来又变成了什么明显的,是我有3个表:

文件(数据有关的文件,网址等) 等级(可用级水平的表可能的1 -6开始) files_grades(结表)

这是有道理的。我只是想确保我明白我在做什么之前要做的事情。比方说,用户A上传文件xyz,并决定它对2和3年级是好的。

我会写一个记录到“文件”表与关于该文件的数据(大小,网址,描述,名称,主key files_id)。比方说,它得到ID 345

由于等级选项数量有限,成绩可能会被等同于他们的ID(即1级为grades_id 1,2级是grades_id 2)

我会然后写两个记录包含

files_grade_id,files_id的 “files_grade” 结表,grades_id即

1,345,2

1,345,3

表示files_id 345适合的2个等级。然后,我挥舞我的魔术SELECT和JOIN魔杖并拉出我需要的数据。

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

问题2刚刚在我身上恍然大悟:所以,一节课可以有多个“成绩”。没问题,我们只是解决了这个问题(我希望!)。但理论上它可以有多个“学校” - 小学,中学,高等。如果一个文件条目的Middle,High等级为1,2,我们该怎么办?通过说“每个文件一个学校,用户!”可以很容易地解决这个问题,但我喜欢把它扔到那里。

回答

0

从它的声音,它听起来很不错。但是,只有一件事:你并不需要为桥接表(FILES_GRADES)设置一个ID,如果你这样做,你需要增加ID。

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

+0

啊。这就说得通了!谢谢。 – GilloD 2010-02-19 02:40:58

1

然后我会写两个记录包含

files_grade_id,files_id的 “files_grade” 结合表,并在这里grades_id即

files_grade_id是多余的,因为组合files_idgrades_id已经唯一的(因而可以设置作为主键)。

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

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

+0

以下是头痛:这是针对K-6的韩国学校。然后中1-2和高1-4。的Bleh。新想法:在捕捉点, 如果学校=高中和等级= 2,等级= 10或其他。我需要考虑一点。我可能会坚持单一的东西。 – GilloD 2010-02-19 02:54:44

0

既然你第一个问题已经回答了,我会采取刺伤第二个。

有多种方法可以做到这一点,但一种可能性是添加另一个表的“学校”,并把它作为联接表的一部分 - 重命名过程的结合表以匹配新的设计。所以,你可以有:

School Table: 

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

Files_grades_school 

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

你可能会想要根据你的使用模式创建多个索引。

+0

问题是可能存在MULTIPLE学校ID。我想我现在只限于一个。老实说,他们都是一样的技能明智的,区别在于基础课程量身定制的课程,其中中/高是免费的形式 – GilloD 2010-02-19 06:14:40

+0

不要添加任何额外的复杂性,如果你不需要它。所以,如果你不相信这是必要的,那么就不需要增加这种额外的复杂性。但是,请确保客户同意学校的区别不会影响课程计划,因为一旦您的表中有数据,在将来进行更改将会变得更加困难。 – 2010-02-19 13:42:32