数据库结构问题

时间:2013-02-05 11:58:00

标签: sql database database-design relational-database

以下是该方案: 有老师教各种科目。主题包括章节。可能有不止一位教师教授相同的科目,但分配了不同的章节。章节内有主题,分主题(分层)。

我关注的是实体:章节,主题。章节有像teacher_id,subject_id,title,designated_hours这样的属性。主题(也有子主题和子主题可能包含其中的子主题,即分层)。主题属性是title,teaching_methodology,hours,periods,completion_date。

我建议的结构:

chapters                  topics
 -id                       -id
 -subject_id (fk)          -chapter_id (fk) references chapters
 -teacher_id (fk)          -parent_id (fk) references topics itself
 -title                    -title
 -designated_hours         -hours
                           -periods
                           -completion_date
                           -teaching_methodology

我的问题是我的结构是否正常化了?如果主题包含子主题,则hours,periods,completion_date,teaching_methodology等字段将为null。我应该为这些属性创建单独的表,如

  topic_properties
   -id
   -topic_id (fk) references topic
   -hours
   -periods

您还可以提出其他数据库结构。我只是想确保在开始这个模块之前我得到了结构

1 个答案:

答案 0 :(得分:1)

我认为你在这里正确,你不需要额外的表格。我只是进行一些小调整,以确保父母和子女主题不属于不同的章节:

CREATE TABLE chapters (
    chapter_id INT PRIMARY KEY
    -- (other fields)
);

CREATE TABLE topics (
    chapter_id INT,
    topic_no INT,
    parent_topic_no INT,
    -- (other fields)
    PRIMARY KEY (chapter_id, topic_no),
    FOREIGN KEY (chapter_id)
        REFERENCES chapters (chapter_id),
    FOREIGN KEY (chapter_id, parent_topic_no)
        REFERENCES topics (chapter_id, topic_no)
);

请注意第二个FK如何强制子行与父行具有相同的chapter_id

[SQL Fiddle]