Загрузка данных


/* =========================================================
   ПРЕДМЕТНАЯ ОБЛАСТЬ: ТАКСИ
   ГРУППА ИС1-33
   ========================================================= */


/* =========================
   1. КЛИЕНТЫ
   ========================= */

CREATE TABLE dbo.TaxiClients33
(
    ClientID INT IDENTITY(1,1) NOT NULL,
    FullName NVARCHAR(150) NOT NULL,
    Phone NVARCHAR(20) NOT NULL,
    Email NVARCHAR(100) NOT NULL,
    RegistrationDate DATETIME2 NOT NULL
        CONSTRAINT DF_TaxiClients33_RegistrationDate
        DEFAULT SYSDATETIME(),

    CONSTRAINT PK_TaxiClients33
        PRIMARY KEY (ClientID),

    CONSTRAINT UQ_TaxiClients33_Phone
        UNIQUE (Phone),

    CONSTRAINT UQ_TaxiClients33_Email
        UNIQUE (Email)
);
GO


/* =========================
   2. ВОДИТЕЛИ
   ========================= */

CREATE TABLE dbo.TaxiDrivers33
(
    DriverID INT IDENTITY(1,1) NOT NULL,
    FullName NVARCHAR(150) NOT NULL,
    Phone NVARCHAR(20) NOT NULL,
    LicenseNumber NVARCHAR(30) NOT NULL,
    HireDate DATE NOT NULL,
    Rating DECIMAL(3,2) NOT NULL
        CONSTRAINT DF_TaxiDrivers33_Rating DEFAULT 5.00,
    Status NVARCHAR(20) NOT NULL
        CONSTRAINT DF_TaxiDrivers33_Status DEFAULT N'Свободен',

    CONSTRAINT PK_TaxiDrivers33
        PRIMARY KEY (DriverID),

    CONSTRAINT UQ_TaxiDrivers33_Phone
        UNIQUE (Phone),

    CONSTRAINT UQ_TaxiDrivers33_License
        UNIQUE (LicenseNumber),

    CONSTRAINT CK_TaxiDrivers33_Rating
        CHECK (Rating BETWEEN 0 AND 5),

    CONSTRAINT CK_TaxiDrivers33_Status
        CHECK
        (
            Status IN
            (
                N'Свободен',
                N'На заказе',
                N'Не работает'
            )
        )
);
GO


/* =========================
   3. АВТОМОБИЛИ ТАКСИ
   ========================= */

CREATE TABLE dbo.TaxiCars33
(
    CarID INT IDENTITY(1,1) NOT NULL,
    RegistrationNumber NVARCHAR(15) NOT NULL,
    Brand NVARCHAR(50) NOT NULL,
    Model NVARCHAR(50) NOT NULL,
    Color NVARCHAR(30) NOT NULL,
    ProductionYear SMALLINT NOT NULL,
    CarClass NVARCHAR(30) NOT NULL,
    Status NVARCHAR(20) NOT NULL
        CONSTRAINT DF_TaxiCars33_Status DEFAULT N'Свободен',

    CONSTRAINT PK_TaxiCars33
        PRIMARY KEY (CarID),

    CONSTRAINT UQ_TaxiCars33_RegNumber
        UNIQUE (RegistrationNumber),

    CONSTRAINT CK_TaxiCars33_Year
        CHECK (ProductionYear BETWEEN 1990 AND 2100),

    CONSTRAINT CK_TaxiCars33_Class
        CHECK
        (
            CarClass IN
            (
                N'Эконом',
                N'Комфорт',
                N'Бизнес'
            )
        ),

    CONSTRAINT CK_TaxiCars33_Status
        CHECK
        (
            Status IN
            (
                N'Свободен',
                N'На заказе',
                N'Ремонт'
            )
        )
);
GO


/* =========================
   4. ТАРИФЫ
   ========================= */

CREATE TABLE dbo.TaxiTariffs33
(
    TariffID INT IDENTITY(1,1) NOT NULL,
    TariffName NVARCHAR(50) NOT NULL,
    BasePrice DECIMAL(10,2) NOT NULL,
    PricePerKm DECIMAL(10,2) NOT NULL,
    PricePerMinute DECIMAL(10,2) NOT NULL,

    CONSTRAINT PK_TaxiTariffs33
        PRIMARY KEY (TariffID),

    CONSTRAINT UQ_TaxiTariffs33_Name
        UNIQUE (TariffName),

    CONSTRAINT CK_TaxiTariffs33_Prices
        CHECK
        (
            BasePrice >= 0
            AND PricePerKm >= 0
            AND PricePerMinute >= 0
        )
);
GO


/* =========================
   5. ЗАКАЗЫ / ПОЕЗДКИ
   ========================= */

CREATE TABLE dbo.TaxiOrders33
(
    OrderID INT IDENTITY(1,1) NOT NULL,

    ClientID INT NOT NULL,
    DriverID INT NULL,
    CarID INT NULL,
    TariffID INT NOT NULL,

    OrderDate DATETIME2 NOT NULL
        CONSTRAINT DF_TaxiOrders33_OrderDate
        DEFAULT SYSDATETIME(),

    PickupAddress NVARCHAR(250) NOT NULL,
    DestinationAddress NVARCHAR(250) NOT NULL,

    StartTime DATETIME2 NULL,
    EndTime DATETIME2 NULL,

    DistanceKm DECIMAL(8,2) NULL,
    DurationMinutes INT NULL,

    TotalAmount DECIMAL(10,2) NULL,

    Status NVARCHAR(30) NOT NULL
        CONSTRAINT DF_TaxiOrders33_Status
        DEFAULT N'Создан',

    CONSTRAINT PK_TaxiOrders33
        PRIMARY KEY (OrderID),

    CONSTRAINT FK_TaxiOrders33_Client
        FOREIGN KEY (ClientID)
        REFERENCES dbo.TaxiClients33(ClientID),

    CONSTRAINT FK_TaxiOrders33_Driver
        FOREIGN KEY (DriverID)
        REFERENCES dbo.TaxiDrivers33(DriverID),

    CONSTRAINT FK_TaxiOrders33_Car
        FOREIGN KEY (CarID)
        REFERENCES dbo.TaxiCars33(CarID),

    CONSTRAINT FK_TaxiOrders33_Tariff
        FOREIGN KEY (TariffID)
        REFERENCES dbo.TaxiTariffs33(TariffID),

    CONSTRAINT CK_TaxiOrders33_Status
        CHECK
        (
            Status IN
            (
                N'Создан',
                N'Принят',
                N'В пути',
                N'Завершён',
                N'Отменён'
            )
        ),

    CONSTRAINT CK_TaxiOrders33_Distance
        CHECK (DistanceKm IS NULL OR DistanceKm >= 0),

    CONSTRAINT CK_TaxiOrders33_Duration
        CHECK (DurationMinutes IS NULL OR DurationMinutes >= 0),

    CONSTRAINT CK_TaxiOrders33_Amount
        CHECK (TotalAmount IS NULL OR TotalAmount >= 0),

    CONSTRAINT CK_TaxiOrders33_Time
        CHECK
        (
            EndTime IS NULL
            OR StartTime IS NULL
            OR EndTime >= StartTime
        )
);
GO


/* =========================
   6. ПЛАТЕЖИ
   ========================= */

CREATE TABLE dbo.TaxiPayments33
(
    PaymentID INT IDENTITY(1,1) NOT NULL,
    OrderID INT NOT NULL,

    Amount DECIMAL(10,2) NOT NULL,
    PaymentDate DATETIME2 NOT NULL
        CONSTRAINT DF_TaxiPayments33_Date
        DEFAULT SYSDATETIME(),

    PaymentMethod NVARCHAR(30) NOT NULL,
    Status NVARCHAR(20) NOT NULL,

    CONSTRAINT PK_TaxiPayments33
        PRIMARY KEY (PaymentID),

    CONSTRAINT FK_TaxiPayments33_Order
        FOREIGN KEY (OrderID)
        REFERENCES dbo.TaxiOrders33(OrderID),

    CONSTRAINT CK_TaxiPayments33_Amount
        CHECK (Amount > 0),

    CONSTRAINT CK_TaxiPayments33_Method
        CHECK
        (
            PaymentMethod IN
            (
                N'Наличные',
                N'Карта',
                N'Онлайн'
            )
        ),

    CONSTRAINT CK_TaxiPayments33_Status
        CHECK
        (
            Status IN
            (
                N'Ожидает',
                N'Оплачен',
                N'Возврат'
            )
        )
);
GO


/* =========================
   7. ОТЗЫВЫ
   ========================= */

CREATE TABLE dbo.TaxiReviews33
(
    ReviewID INT IDENTITY(1,1) NOT NULL,
    OrderID INT NOT NULL,
    Rating TINYINT NOT NULL,
    Comment NVARCHAR(500) NULL,
    ReviewDate DATETIME2 NOT NULL
        CONSTRAINT DF_TaxiReviews33_Date
        DEFAULT SYSDATETIME(),

    CONSTRAINT PK_TaxiReviews33
        PRIMARY KEY (ReviewID),

    CONSTRAINT UQ_TaxiReviews33_Order
        UNIQUE (OrderID),

    CONSTRAINT FK_TaxiReviews33_Order
        FOREIGN KEY (OrderID)
        REFERENCES dbo.TaxiOrders33(OrderID),

    CONSTRAINT CK_TaxiReviews33_Rating
        CHECK (Rating BETWEEN 1 AND 5)
);
GO


/* Индексы */

CREATE INDEX IX_TaxiOrders33_Client
ON dbo.TaxiOrders33(ClientID);
GO

CREATE INDEX IX_TaxiOrders33_Driver
ON dbo.TaxiOrders33(DriverID);
GO

CREATE INDEX IX_TaxiOrders33_Status
ON dbo.TaxiOrders33(Status);
GO