Sql 使用外键的数据库规范化
我有一个示例表,如下所示,其中存储了一名学生的课程完成状态:Sql 使用外键的数据库规范化,sql,sql-server,database-normalization,Sql,Sql Server,Database Normalization,我有一个示例表,如下所示,其中存储了一名学生的课程完成状态: Create Table StudentCourseCompletionStatus ( CourseCompletionID int primary key identity(1,1), StudentID int not null, AlgorithmCourseStatus nvarchar(30), DatabaseCourseStatus nvarchar(30), Networkin
Create Table StudentCourseCompletionStatus
(
CourseCompletionID int primary key identity(1,1),
StudentID int not null,
AlgorithmCourseStatus nvarchar(30),
DatabaseCourseStatus nvarchar(30),
NetworkingCourseStatus nvarchar(30),
MathematicsCourseStatus nvarchar(30),
ProgrammingCourseStatus nvarchar(30)
)
Insert into StudentCourseCompletionStatus Values (1, 'In Progress', 'In Progress', 'Not Started', 'Completed', 'Completed')
Insert into StudentCourseCompletionStatus Values (2, 'Not Started', 'In Progress', 'Not Started', 'Not Applicable', 'Completed')
现在,作为规范化模式的一部分,我创建了另外两个表-CourseStatusType
和Status
,用于存储课程状态名称和状态
Create Table CourseStatusType
(
CourseStatusTypeID int primary key identity(1,1),
CourseStatusType nvarchar(100) not null
)
Insert into CourseStatusType Values ('AlgorithmCourseStatus')
Insert into CourseStatusType Values ('DatabaseCourseStatus')
Insert into CourseStatusType Values ('NetworkingCourseStatus')
Insert into CourseStatusType Values ('MathematicsCourseStatus')
Insert into CourseStatusType Values ('ProgrammingCourseStatus')
Insert into CourseStatusType Values ('OperatingSystemsCourseStatus')
Insert into CourseStatusType Values ('CompilerCourseStatus')
Create Table Status
(
StatusID int primary key identity(1,1),
StatusName nvarchar (100) not null
)
Insert into Status Values ('Completed')
Insert into Status Values ('Not Started')
Insert into Status Values ('In Progress')
Insert into Status Values ('Not Applicable')
修改后的表格如下:
Create Table StudentCourseCompletionStatus1
(
CourseCompletionID int primary key identity(1,1),
StudentID int not null,
CourseStatusTypeID int not null CONSTRAINT [FK_StudentCourseCompletionStatus1_CourseStatusType] FOREIGN KEY (CourseStatusTypeID) REFERENCES dbo.CourseStatusType (CourseStatusTypeID),
StatusID int not null CONSTRAINT [FK_StudentCourseCompletionStatus1_Status] FOREIGN KEY (StatusID) REFERENCES Status (StatusID),
)
我对此没有什么问题:
没问题。在数据表上创建新的数字列,并使用与每个数据表记录关联的查找表记录的标识符填充这些列。如果它们可以为空,您可以立即将它们设置为外键。如果它们不可为null,则需要先填充它们,然后才能生成外键。验证数据是否正确后,删除旧的非规范化列。完成。在
StudentCourseCompletionStatus1
中,您仍然需要两个关联到Status
和CourseStatusType
。所以我认为你应该考虑以下的规范化变型:
这意味着,您的StudentCourseCompletionStatus
将只保存一个CourseStatusID,而另一个表CourseStatus
将保存与CourseType
和状态的关联
要移动数据,您当然可以使用查询。在StudentCourseCompletionStatus1
中,您仍然需要两个关联到Status
和CourseStatusType
。所以我想你