【问题标题】:Database schema for a school学校的数据库模式
【发布时间】:2011-03-29 21:29:43
【问题描述】:

这是创建数据库所需的数据库查询:

create table Area
(
AreaId int primary key identity(1,1),
Name nvarchar(64) not null
)

create table Level
(
LevelId int primary key identity(1,1),
Name nvarchar(32) not null,
Principle nvarchar(512) not null
)

create table Subject
(
SubjectId int primary key identity(1,1),
AreaId int foreign key references Area(AreaId),
LevelId int foreign key references Level(LevelId),
Name nvarchar(32) not null,
Abbreviation nvarchar(16)
)

create table StaffType
(
StaffTypeId int primary key identity(1,1),
Name nvarchar(64) not null
)

create table Staff
(
StaffId int primary key identity(1,1),
StaffTypeId int foreign key references StaffType(StaffTypeId),
Name nvarchar(128) not null,
LastNameFather nvarchar(256) not null,
LastNameMother nvarchar(256) not null,
DateOfBirth datetime,
PlaceOfBirth nvarchar(256),
Sex nvarchar(8) not null,
Carnet nvarchar(64),
Telephone nvarchar(64),
MobilePhone nvarchar(64),
Address nvarchar(256),
FatherName nvarchar(256),
MotherName nvarchar(256),
FatherContactNumber nvarchar(64),
MotherContactNumber nvarchar(64),
FatherPlaceOfWork nvarchar(64),
MotherPlaceOfWork nvarchar(64),
DateOfHiring datetime,
YearsOfService int,
Formation nvarchar(128)
)

create table Grade
(
GradeId int primary key identity(1,1),
Name nvarchar(32) not null,
LevelId int foreign key references Level(LevelId),
Observation nvarchar(256)
)

create table GradeInstance
(
GradeInstanceId int primary key identity(1,1),
StaffId int foreign key references Staff(StaffId),
GradeId int foreign key references Grade(GradeId),
Name nvarchar(32) not null,
Year datetime
)

create table Student
(
StudentId int primary key identity(1,1),
RUDE int,
Name nvarchar(64) not null,
LastNameFather nvarchar(256) not null,
LastNameMother nvarchar(256) not null,
DateOfBirth datetime not null,
PlaceOfBirth nvarchar(128),
Sex nvarchar(8),
Carnet nvarchar(32),
Telephone nvarchar(64),
MobilePhone nvarchar(64),
Address nvarchar(256),
FatherName nvarchar(512),
MotherName nvarchar(512),
FatherMobilePhone nvarchar(64),
MotherMobilePhone nvarchar(64),
FatherProfession nvarchar(64),
MotherProfession nvarchar(64),
FatherPlaceOfWork nvarchar(256),
MotherPlaceOfWork nvarchar(256),
Observations nvarchar(3000)
)

create table StudentInstance
(
StudentInstanceId int primary key identity(1,1),
GradeInstanceId int foreign key references GradeInstance(GradeInstanceId),
StudentId int foreign key references Student(StudentId)
)

create table StudentGradeReport
(
StudentGradeReportId int primary key identity(1,1),
StudentInstanceId int foreign key references StudentInstance(StudentInstanceId),
SubjectId int foreign key references Subject(SubjectId),
FirstTrimester int,
SecondTrimester int,
ThirdTrimester int,
FinalGrade int
)

如果您发现应该为空检查的属性,请忽略它。我已经与客户讨论过这个问题,如果最终用户选择了某些内容,他们希望将某些内容留空。

在设计此数据库时,我主要关心的是如何将学生与此时此地的成绩相关联,同时保留前几年的记录并设法查看他在 2009 年获得的成绩。看到了吗?

我认为我做得很好,但你永远不知道 - 这里的主脑可能会发现一个缺陷,我希望得到一些反馈。

  • 不再使用 SQLite,而是使用 MSSQL。
  • 我已尽我所能对数据库进行规范化,但并不虔诚,就像让它“点击”所需的一样多。
  • 在学生之前,与教室(年级)实例直接相关。现在我创建学生的“实例”并将它们分配给教室(等级)实例。每个实例都有一个日期,说明它属于哪一年。这有助于我保持前几年的记录,而不会出现肮脏的黑客行为。

【问题讨论】:

  • 真正的问题是什么。重新表述您的问题,以便可以轻松回答。但一般来说:只需将标准化的数据保存在 3nf 中即可。问题应该是如何检索它而不是如何保存它。

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


【解决方案1】:
create table Area
(
AreaId int primary key identity(1,1),
Name nvarchar(64) not null
)

“名称”应该是唯一的。

create table Level
(
LevelId int primary key identity(1,1),
Name nvarchar(32) not null,
Principle nvarchar(512) not null
)

“名称”应该是唯一的。

create table Subject
(
SubjectId int primary key identity(1,1),
AreaId int foreign key references Area(AreaId),
LevelId int foreign key references Level(LevelId),
Name nvarchar(32) not null,
Abbreviation nvarchar(16)
)

其中一项或多项适用的可能性很大。没有代表性的样本数据就无法判断。

  • 设置 {AreaId, LevelId} 应该是 独一无二。
  • “名称”应该是唯一的。
  • “缩写”应该是唯一的。

我的时间不多了。

create table StaffType
(
StaffTypeId int primary key identity(1,1),
Name nvarchar(64) not null
)

“名称”应该是唯一的。

如果我有时间,以后再说。

【讨论】:

    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2011-12-20
    • 1970-01-01
    • 2013-12-28
    相关资源
    最近更新 更多