【问题标题】:Designing a simple database that respects the third normal form设计一个遵循第三范式的简单数据库
【发布时间】:2013-02-02 15:00:30
【问题描述】:

我正在尝试完成 3NF 或小型数据库作业的第三范式。

我有学生、班级和家长。

这是我需要制作的表格:

  • 学生: id、姓名、年级(平均)

  • 班级: class_id、个人资料(班级类型)、class_master、该班级的学生

  • 家长:姓名、地址、学生在校就读

我应该指出的事情:

由于我的英文不太好,我想我应该指定:

  • 班级是一对多的关系,因为一个学生可以是一个班级的一部分,而且只有一个(因此班级是学生的集合,没有别的)。

  • 个人资料是类的特化(同样,学生分组机制称为类)。 例如:简介:数学、文学、计算机科学

[/我应该指出的事情]

再次,我必须制作符合 3NF 准则的表格,而不是与我刚才提到的完全一样的表格

我在想:

Class: 
   class_id primary key, foreign key (class_master_name) 

Profile: 
   class_master_name primary key, profile_name

Student: 
   student_id primary key, name, grade (avg), foreign key (class_id)

Parent: 
   parent_id primary key, name, address

因此,Class、Profile、Student 和 Parent 将是 3NF,因为所有非关键元素都严格指代关键、整个关键,并且仅指关键。

我的问题(或者说是需要回答的具体问题):

  • 学生班级关系好吗?学生参考班级就够了吗?我无法想象在没有与2NF1NF 冲突的重复数据的情况下,课堂可以引用学生的方式。

  • 每个学生最多有两个父母(一个或两个都可能已经死了或根本不知道)。我想有一张桌子Relationship: student_id, parent_1_id, parent_2_id,但我不知道如何实现它。我如何(在 SQL Server Management Studio 2008 中)制作此表(其中parent_1_id != parent_2_id 以及 student_idprimary key 也是foreign key

  • 这实际上是3NF 还是我做错了什么?

我是如何想到实现Relationship: student_id, parent_1_id, parent_2_id

CREATE TABLE Relationship (
     student_id int NOT NULL PRIMARY KEY,
     parent_1_id int,
     parent_2_id int,
     CONSTRAINT (parent_1_id, parent_2_id) FOREIGN KEY 
         REFERENCES Parent (parent_id, parent_id),
     CONSTRAINT  (student_id) FOREIGN KEY 
         REFERENCES Student (student_id)
)

可以吗?

【问题讨论】:

    标签: database sql-server-2008 database-design


    【解决方案1】:

    看起来你需要类似的东西:

    Class.ProfileIdStudent.ClassId 不是 NULL,而 Parent1IdParent2Id 可以为 NULL。)

    【讨论】:

    • 能否提供Relationship: student_id, parent_1_id, parent_2_id 的代码?我在我的版本中编辑,我只是​​不知道它是否好。我可以按照您解释的方式为学生修改它,但我想要(作为概念证明)我最初提到的表格。谢谢
    • @Kalec 它已经在那里了。孩子和母亲的关系是N:1。孩子和父亲也一样。由于这不是 M:N,因此您不需要额外的“连接”或“链接”表。
    【解决方案2】:
    ClassType:    
    classtype (primary key)
    name
    etc...    
    
    Class:
    classid (primary key)
    classtype (foreign key)
    classname
    etc...
    
    Person:
    personid (primary key)
    name
    dob
    etc....
    
    ClassStudent:
    studentid (primary key)
    classid (foreign key)
    personid (foreign key)
    grade
    etc
    
    PersonRelation:
    relationid (primary key)
    prim_personid (foreign key)
    sec_personid (foreign key)
    relationship (parent, sibling, etc)
    etc
    

    【讨论】:

    • 问候PersonRelation 我只需要父母,别无其他。我不明白为什么我需要一个relationid,因为这仅用于与“学校”需要的相关联,因此学生作为主键很好。但是,ClassStudent 听起来是个好主意,但我还是不明白personID。实际上,没有一点解释,我对任何事情都没有 [得到/同意]。
    • 一个人要么是父母,要么是学生。您使用 ClassStudent 将 Person 链接到 Class。您使用 PersonRelation 将父级(Person)链接到子级(另一个 Person)。这将支持除父/子之外的其他关系。兄弟/姐妹丈夫/妻子等
    猜你喜欢
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2017-04-03
    • 2017-12-27
    • 2014-07-20
    • 2011-08-24
    • 2011-04-15
    • 2011-05-21
    相关资源
    最近更新 更多