Sql-Server
如何為講師安排添加日期和時間
問題
我需要進行數據庫設計 (ERD) 以顯示每位講師的日程安排,包括以下內容:
- 課程日期(例如星期六或星期一)
- 上課時間(從中午 12 點到下午 3 點)
- 它將提供什麼課程(C# 或 SQL)
例子
講師 Martin 在周一和周六的 12 pm - 03 pm 期間提供 C# 課程,在周日和周三的 12 pm - 03 pm 期間提供 SQL 課程。
細節
我設計了以下表格:
- 講師表(InstructorID、InstructorName)
- 課程表(CourseID、CourseName)
- Instructors_courses 表(instcourseID、InstructorID、CourseID)
Instructors 表和 Courses 表之間的關係是多對多的,所以我做了另一個表 Instructors_Courses。
問題
- 如何表示添加的每門課程的日期和時間
我可以添加時間表和天表,並通過添加日期 ID 和時間 ID(一對多)與 Instructors_courses 表建立關係
或者從使用者界面進行程式。 2. 課程開始日期和課程結束日期這兩個欄位如何在表 Instructors_courses 中表示。
我可以添加,但每門課程都會重複這是正確的還是什麼。
嘗試像這樣製作instructor_course 表
CREATE TABLE instructor_course ( InstructorCourseID int IDENTITY (1,1) CONSTRAINT pk_instructor_course PRIMARY KEY CLUSTERED NOT NULL, DayName char(10) NOT NULL, CourseID int CONSTRAINT fk_CourseID_instructor_course REFERENCES Course(CourseID) NOT NULL, InstructorID ... StartTime time NOT NULL, EndTime time NOT NULL, StartDate date NOT NULL, EndDate date NULL);
然後,如果您想強制執行不能同時為兩門課程安排時間表的規則,您還可以在表格中添加一些約束。如果一門課程在一周內有多個課程,每個課程將在此表中佔一行。
做這樣的事情怎麼樣:
CREATE TABLE [dbo].[ScheduledCourses] ( [Course] INT NOT NULL REFERENCES [dbo].[Course]([Id]), [Instructor] INT NOT NULL REFERENCES [dbo].[Instructor]([Id]), [StartOn] DATETIME2(0) NOT NULL, [EndOn] DATETIME2(0) NOT NULL, PRIMARY KEY ([Course],[Instructor],[StartOn],[EndOn]) );
現在您需要確保不僅課程和講師的開始日期和結束日期不同,還需要確保它們不重疊。例如我可以這樣做:
INSERT [dbo].[ScheduleCourses] VALUES (1,1,'01/01/2016 12:00:00', '01/01/2016 15:00:00'); INSERT [dbo].[ScheduleCourses] VALUES (1,1,'01/01/2016 13:00:00', '01/01/2016 16:00:00');
根據正常的密鑰規則,它是有效的——但從邏輯上講它不是。它們可能沒有相同的開始和結束日期和時間,但它們確實重疊 - 為了解決這個問題,您可以實現一個
CHECK
約束來強制執行邏輯:CREATE FUNCTION [dbo].[CheckScheduledCourseDoesNotOverlap]( @course INT, @instructor INT, @startOn DATETIME2(0), @endOn DATETIME(0) ) RETURNS BIT AS BEGIN DECLARE @overlaps BIT = 0; IF EXISTS(SELECT * FROM [dbo].[ScheduledCourses] WHERE [Course] = @course AND [Instructor] = @instructor AND(@startOn BETWEEN [StartOn] AND [EndOn] OR @endOn BETWEEN [StartOn] AND [EndOn])) BEGIN SET @overlap = 1; END RETURN @overlap; END GO
此功能檢查新記錄是否與現有記錄重疊。然後,您可以對錶應用檢查約束,如下所示:
ALTER TABLE [dbo].[ScheduledCourses] ADD CONSTRAINT [CK_ScheduledCourses] CHECK ([dbo].[CheckScheduledCourseDoesNotOverlap]([Course],[Instructor],[StartOn],[EndOn]); GO
這應該符合您的要求。我不會親自將日期名稱儲存在表中,而是使用該
DATEPART
函式在查詢中返回它。我沒有機會測試程式碼,這只是我的想法,所以當你試一試時要注意。