2010-04-28 3 views
3

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

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

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

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

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

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

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

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

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

+0

> 3) Есть ли сайт, который дает такие интересные вопросы дизайна базы данных ... Я предполагаю, что ответ на этот вопрос - «ваш класс». – tpdi

+1

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

+0

Похоже на то, что мне поручено, не так сложно, я бы посоветовал пойти и опубликовать ваши материалы, если вам нужна помощь по конкретным пунктам ;-) –

ответ

1

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

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

Спасибо. Один ключевой момент. Как вы определяете порядок расположения; как L3 после L2? – Lijo

+0

Потому что автобус движется по прямой линии, а l3 - после l2. Если вы не вернетесь, в этом случае l3 появится до l2. Или вы телепортируетесь, и в этом случае l1 появляется после l3, а l2 - до l4. –

+0

Моя точка зрения заключается в том, что мы не должны использовать порядок записей в таблице Location в качестве порядка фактического местоположения. – Lijo

0

Ключ таблица w ульд быть:

поездка (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 

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

Per комментарий ниже, может быть, я недоразумение требование. Вы пытаетесь найти ТРИПС, у которых более 2 пассажиров, или МЕСТОРАСПОЛОЖЕНИЕ, которые имеют более 2 пассажиров, или что? То есть, если у нас есть поездки (Al, L1, L2), (Бетти, L1, L2), (Карл, L1, L3), (Donna, 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_stop:

trip_stop (passenger_id, LOCATION_ID, stop_number)

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

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

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

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

Я не думаю, что это будет соответствовать требованию. Когда вы группируете, используя начальное местоположение и конечное местоположение, каждый из них будет создавать отдельную группу. Никакие записи не будут выбраны. (TripID PassID StartLoc EndLoc) (1 P1 L1 L4) (1 P2 L2 L4) (1 P3 L3 L4) – Lijo

0

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

Смежные вопросы