Вопрос дизайна базы данных - PullRequest
3 голосов
/ 28 апреля 2010

У меня есть интересная проблема проектирования базы данных, которую я сформулировал, путешествуя на автобусе, возвращаясь из дома.

Разработка нормализованной базы данных для системы продажи билетов на автобусы (а не системы бронирования). В каждой поездке проводник автобуса будет раздавать билеты своим пассажирам после получения от них платы за проезд. Пассажиры путешествуют из разных мест в разные места назначения.

Система должна иметь возможность сообщать о местах, для которых количество пассажиров превысило 2.

Предположим, что остановки для автобуса L1, L2, L3 и L4 Предположим, пассажир P1 путешествует из L1 в L4. P2 путешествует от L2 до L4. P3 путешествует от L3 до L4.

В отчете должен быть указан только список (L3-L4), для которого в нем более 2 путешественников.

Можете ли вы помочь мне решить следующие проблемы

1) Разработка нормализованной базы данных

2) Написать запрос для отчета

3) Есть ли сайт, который дает такие интересные вопросы о дизайне базы данных и ответы?

Ответы [ 3 ]

1 голос
/ 28 апреля 2010

Дизайн базы данных:

Location Table

 - LocationID  (p)
 - LocationName

TravelTable 

 - TravelID  (p)
 - PassengerID
 - LocationFrom (F) - (Location - LocationID)
 - LocationTo  (F) - (Location - LocationID)

PassengerTable

 - PassengerID (p)
 - PassengerName

Скоро свяжемся с вами и запросом

Форма сайта, где вы получите правильный ответ

http://blog.sqlauthority.com/

http://www.sqlservercentral.com/

0 голосов
/ 05 мая 2010

Это напоминает мне анализ жизнеспособности из класса компиляторов. Там цель состоит в том, чтобы выяснить, какие переменные используются одновременно, чтобы распределение регистров было более эффективным. Другие ответы довольно хорошо охватывают часть базы данных. Для алгоритма определения того, какие x (поездка, местоположение) имеют несколько пассажиров, читайте анализ живучести и линейное сканирование

0 голосов
/ 28 апреля 2010

Таблица ключей будет:

trip (trip_id, passenger_id, start_location_id, end_location_id)

Возможно, у вас есть таблица местоположений с информацией об остановках.

Тогда запрос будет просто

select start_location_id, end_location_id, count(*)
from trip
group by start_location_id, end_location_id
having count(*)>=2

Редактировать

За комментарий ниже, может быть, я неправильно понимаю требование. Вы пытаетесь найти ПОЕЗДКИ, в которых более 2 пассажиров, или МЕСТА, в которых более 2 пассажиров, или что? То есть, если у нас есть поездки (Al, L1, L2), (Бетти, L1, L2), (Карл, L1, L3), (Донна, L2, L4), если результат будет:

L1, L2, 2

(и это все)?

Или это должно быть

L1, 3
L2, 3

Полагаю, мой запрос выше даст первый результат. Если вы ищете второй результат, он будет:

select location, sum(visits)
from
(
select start_location_id as location, count(*) as visits
from trip
union
select end_location_id as location, count(*) as visits
from trip
)
group by location
having sum(visits)>=2
order by location

Поскольку вы складываете счетчики для двух разных столбцов, я не вижу способа избежать использования объединения и внутреннего запроса.

Возможно, другая схема сделает этот запрос намного проще, а именно, вместо trip есть trip_stop:

trip_stop (идентификатор пассажира, идентификатор местоположения, номер остановки)

где stop_number, скажем, 1 для начального местоположения и 2 для конечного местоположения.

Теперь, когда я думаю об этом, это действительно лучше, так как устраняется необходимость иметь два поля, представляющих одну и ту же идею, а также упрощается расширение до поездок с несколькими остановками.

Тогда запрос просто становится

select location_id, count(*)
from trip_stop
group by location_id
having count(*)>=2
order by location_id
...