Автомобили (гос. номер, марка, модель, тип двигателя, пробег) зоны парковки (адрес, количество мест), клиенты (ID, ФИО, водительский стаж).
Клиенты арендуют автомобили на определенные промежутки времени, поездки начинаются и заканчиваются в зонах парковки. Выходные документы: Выдать список самых популярных зон парковки для начала поездок за указанный период, отсортированный по количеству поездок. Для заданного клиента выдать историю всех поездок с указанием стоимости и пробега, отсортированную по дате поездки.
• Используются правила нормализации (вероятно, правила преобразования ER-диаграммы в реляционную модель) • Предполагается, что при использовании этих правил получаются четыре таблицы: Clients, Cars, ParkingZones, Rentals
Сущность "Клиенты" → Таблица CLIENTS • Атрибуты: client_id, first_name, last_name, driving_exp • Первичный ключ: client_id
Сущность "Автомобили" → Таблица CARS • Атрибуты: car_id, license_plate, brand, model, engine_type, mileage • Первичный ключ: car_id
Сущность "Зоны парковки" → Таблица PARKING_ZONES • Атрибуты: zone_id, address, spots_count • Первичный ключ: zone_id
Связь "Аренда" → Таблица RENTALS • Атрибуты: rental_id, client_id, car_id, start_zone_id, end_zone_id, start_time, end_time, cost, distance • Первичный ключ: rental_id • Внешние ключи: client_id, car_id, start_zone_id, end_zone_id
- Каждая сущность становится таблицей
- Атрибуты сущности становятся столбцами таблицы
- Связь "многие-ко-многим" между Клиентами и Автомобилями преобразуется в отдельную таблицу RENTALS
- Связи "один-ко-многим" между Зонами парковки и Поездками реализуются через внешние ключи в таблице RENTALS
• Сущность Клиент: Хранит информацию о клиентах системы. ID_клиента – первичный ключ. • Сущность Автомобиль: Содержит информацию об автомобилях в системе. Гос_номер – первичный ключ. Также включает ID_зоны_парковки в качестве внешнего ключа, чтобы отслеживать, где в данный момент находится автомобиль. • Сущность Зона_парковки: Хранит информацию о зонах парковки. ID_зоны_парковки – первичный ключ. • Сущность Аренда: Представляет факт аренды автомобиля. ID_аренды – первичный ключ. Содержит внешние ключи, ссылающиеся на клиентов (ID_клиента), автомобили (Гос_номер), а также зоны парковки начала и конца аренды (ID_зоны_начала, ID_зоны_конца). Также хранит время начала и конца аренды и общую стоимость.
• Клиент ---< Аренда (1:M): Один клиент может совершить много аренд. • Автомобиль ---< Аренда (1:M): Один автомобиль может быть арендован много раз разными клиентами. • Зона_парковки ---< Автомобиль (1:M): В одной зоне парковки может одновременно находиться несколько автомобилей. (Обратите внимание: эта связь описывает текущее местоположение автомобиля.) • Зона_парковки ---< Аренда (1:M, x2): Зона парковки является местом начала и завершения аренды.
Clients: client_id (идентификатор клиента). Использование суррогатного ключа является хорошей практикой, так как исключает зависимость от бизнес-данных.
Cars: car_id (идентификатор автомобиля). Аналогично, суррогатный ключ обеспечивает стабильность ссылок.
ParkingZones: zone_id (идентификатор зоны парковки). Суррогатный ключ для уникальной идентификации зон.
Rentals: rental_id (идентификатор аренды). Автоматический уникальный ID для каждой поездки.
key = (client_id, car_id, start_zone_id, end_zone_id) - составной внешний ключ в Rentals, ссылающийся на Clients, Cars и ParkingZones (дважды).
Таблица: CLIENTS (Клиенты) client_id: INTEGER (первичный ключ, автоинкремент)
first_name: VARCHAR(50) (имя)
last_name: VARCHAR(50) (фамилия)
driving_exp: INTEGER (водительский стаж в годах)
Таблица: CARS (Автомобили) car_id: INTEGER (первичный ключ, автоинкремент)
license_plate: VARCHAR(20) (государственный номер)
brand: VARCHAR(50) (марка автомобиля)
model: VARCHAR(50) (модель автомобиля)
engine_type: VARCHAR(20) (тип двигателя)
mileage: INTEGER (пробег в км)
Таблица: PARKING_ZONES (Зоны парковки) zone_id: INTEGER (первичный ключ, автоинкремент)
address: VARCHAR(255) (адрес зоны парковки)
spots_count: INTEGER (количество парковочных мест)
Таблица: RENTALS (Аренды/Поездки) rental_id: INTEGER (первичный ключ, автоинкремент)
client_id: INTEGER (внешний ключ на CLIENTS.client_id)
car_id: INTEGER (внешний ключ на CARS.car_id)
start_zone_id: INTEGER (внешний ключ на PARKING_ZONES.zone_id)
end_zone_id: INTEGER (внешний ключ на PARKING_ZONES.zone_id)
start_time: DATETIME (время начала поездки)
end_time: DATETIME (время окончания поездки)
cost: DECIMAL(10,2) (стоимость поездки)
distance: INTEGER (пробег за поездку в км)