Sql-Server

如何為講師安排添加日期和時間

  • April 4, 2021

問題

我需要進行數據庫設計 (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。

問題

  1. 如何表示添加的每門課程的日期和時間

我可以添加時間表和天表,並通過添加日期 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函式在查詢中返回它。

我沒有機會測試程式碼,這只是我的想法,所以當你試一試時要注意。

引用自:https://dba.stackexchange.com/questions/154323