1

我正在创建数据库以检查Room输入时间是否可用。而且我在编写查询时遇到问题。查询必须检查Schedule表和Reservation表是否与输入的时间重叠。TRUE如果有重叠和没有重叠,查询返回是最好的FALSE。这是一个好的数据库结构(所以我可以只专注于查询)还是我需要重组数据库?请帮我。

我的数据库:

CREATE TABLE "Room" (
    "ID" VARCHAR PRIMARY KEY  NOT NULL  UNIQUE,
    "Name" VARCHAR NOT NULL,
    "Location" VARCHAR NOT NULL,
    "Capacity" INTEGER
)

CREATE TABLE "Schedule" (
    "ID" VARCHAR,
    "Day" VARCHAR,
    "start_time" DATETIME,
    "end_time" DATETIME
)

CREATE TABLE "Reservation" (
    "ID" VARCHAR PRIMARY KEY  NOT NULL,
    "Day" VARCHAR NOT NULL,
    " start_time " DATETIME NOT NULL,
    " end_time " DATETIME NOT NULL,
    "User" VARCHAR
)
4

1 回答 1

2

为每一列选择适当的数据类型,“ID”列最好是INT. 您需要“日”列做什么?无论如何,您的“start_time”和“end_time”列中都有一个日期。

此外,我看不到“房间”表与其他两个表之间的联系。

CREATE TABLE "Room" (
    "ID" INT PRIMARY KEY  NOT NULL  UNIQUE,
    "Name" VARCHAR NOT NULL,
    "Location" VARCHAR NOT NULL,
    "Capacity" INT
)

CREATE TABLE "Schedule" (
    ID INT,
    start_time DATETIME,
    end_time DATETIME,
    room_id INT
)

CREATE TABLE "Reservation" (
    "ID" INT PRIMARY KEY  NOT NULL,
    "start_time " DATETIME NOT NULL,
    "end_time " DATETIME NOT NULL,
    "User" VARCHAR /*you might want to make this an INT, too, and put the users in an extra table*/
    , room_id INT
)

我不知道您使用的是什么 DBMS,所以我也不知道正确的语法,但您最好在 Schedule 和 Reservation 表中的 room_id 列上放置一个外键,并引用 Room 表中的 id 列。

然后你这样做:

SELECT
*
FROM
Room 
LEFT JOIN Schedule ON Room.id = Schedule.room_id
LEFT JOIN Reservation ON Room.id = Reservation.room_id
WHERE 
(
(Schedule.start_time <= $yourStartTime AND Schedule.end_time > $yourEndTime)
OR
(Reservation.start_time <= $yourStartTime AND Reservation.end_time > $yourEndTime)
) 
AND Room.id = $yourRoomId

此查询在房间已满时返回某些内容,而在房间空闲时返回空/NULL。

于 2012-06-11T15:03:45.017 回答