Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Проверочные ограничения  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
Уважаемые знатоки. Подскажите пожалуйста.. У меня есть следующая схема (на рисунке)
Можно ли сделать так, чтобы CHEK-ом или чем-либо еще поставить ограничение чтобы можно было в Рейсы добавлять только те самолеты, которые есть у Авиакомпании

К сообщению приложен файл. Размер - 37Kb
3 янв 13, 14:09    [13718883]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
Glory
Member

Откуда:
Сообщений: 104751
А ваша связь между Рейсы и Самолеты уже это делает
3 янв 13, 14:12    [13718898]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
Glory, эм.. помоему нет. По крайней мере меня никто не останавливает когда я добавляю код самолета которого нет у данной авиакомпании..

Я не уверена в том что сейчас скажу но мне нужно чтобы перед добавлением в тРейсы происходила проверка, что добавляется самолет той авиакомпании которая находится в тРасписания
(у одного расписания много рейсов, каждому расписанию соответствует одна авиакомпания, а самолетов у каждой авиакомпании много)
3 янв 13, 14:20    [13718934]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
Glory
Member

Откуда:
Сообщений: 104751
One_question
Glory, эм.. помоему нет. По крайней мере меня никто не останавливает когда я добавляю код самолета которого нет у данной авиакомпании.

А что тогда означает ваша связь между Рейсы и Самолеты ? Это разве не FK constraint ?
3 янв 13, 14:23    [13718945]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
Glory
А что тогда означает ваша связь между Рейсы и Самолеты ? Это разве не FK constraint ?


Да, это FK constraint но она выполняет только свои действия по умолчанию, добавляет только те коды которые есть у тСамолеты, но мне нужно чтобы она еще проверяла соответствие с авиакомпанией которая есть в Расписаниях
3 янв 13, 14:34    [13718982]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
Glory
Member

Откуда:
Сообщений: 104751
One_question
но мне нужно чтобы она еще проверяла соответствие с авиакомпанией которая есть в Расписаниях

А как в Самолеты могут попасть записи, у которых нет Авиакомпаний ?
А как в Расписания могут попасть записи, у которых нет Авиакомпаний ?
У вас же все эти таблицы связаны FK
3 янв 13, 15:13    [13719111]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
наверное
Guest
наверное, имеется в виду, например:
есть 10 авиакомпаний,
но в таблице Расписания имеются только 2 из 10, на данный момент.
так ТС хочет, чтоб в Рейсы попадали самолеты только тех 2-ух компаний,
а у ней получается добавлять самолеты и оставшихся 8-ми авиакомпаний.
3 янв 13, 15:24    [13719155]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
наверное,

да, именно это и имелось ввиду. Но к сожалению до сих пор не нашла ответа на свой вопрос
3 янв 13, 15:26    [13719163]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
Glory
Member

Откуда:
Сообщений: 104751
наверное
так ТС хочет, чтоб в Рейсы попадали самолеты только тех 2-ух компаний,
а у ней получается добавлять самолеты и оставшихся 8-ми авиакомпаний.

Сначала было так
"можно было в Рейсы добавлять только те самолеты, которые есть у Авиакомпании "
3 янв 13, 15:27    [13719172]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
Glory
Member

Откуда:
Сообщений: 104751
One_question
да, именно это и имелось ввиду. Но к сожалению до сих пор не нашла ответа на свой вопрос

Тогда схема неправильная
3 янв 13, 15:31    [13719189]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
наверное
Guest
Glory,

ну так как было спрошено в начале, фиг бы кто догадался :)
а потом последовало уточнение:
13718982

а по теме, я кроме триггера ничего не посоветую.
поэтому даже не предлагаю
3 янв 13, 15:32    [13719193]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
наверное
а по теме, я кроме триггера ничего не посоветую.
поэтому даже не предлагаю
Можно предложить в Рейсы добавить код авиакомпании, и FK на Расписания и Самолёты делать по двум полям (дополнить полем код_авиакомпании).

Хотя ограничение странное (если это не учебная задача), поскольку рейсы могуть выполняться и самолётами других авиакомпаний.
3 янв 13, 17:17    [13719672]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
alexeyvg,

Изначально кода самолета в Рейсах не было, но преподаватель потребовал чтобы при печати "билета" выводилось название самолета, без этой связи выходило что самолет нигде не указывается..

а так получается что авиакомпания отвечает за всё расписание и указывает какой самолет этой компании будет лететь по заданному рейсу
3 янв 13, 17:58    [13719854]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
One_question,

Да ни за что авиакомпания не отвечает. Ваш пример просто очень упрощенно отображает действительность; данная схема не имеет смысла для БД самой авиакомпании, это скорее схема БД аэропорта либо контролирующего органа, типа РосАвиации. Данные в нее поступают от многих АК, но не заливаются как есть, а сначала делается куча проверок. Этот момент уже совершенно не технический, а чисто административный.

Далеко не все проверки можно реализовать одной только схемой - например, у вас никак не проверяется возможность того, что один и тот же борт заявлен на 2 разных рейса, возможно даже одной и той же АК, но летящих в разные концы планеты. Не может самолет, сев с Лондоне, через час вылететь из Сиднея - ну, по крайней мере на данном этапе технического прогресса.

Если же вам таки надо это сделать, то совет уже дали - включить поле Код АК в первичные ключи таблиц Самолеты и Расписания, сделав их там составными. После этого добавить такое поле в таблицу рейсов и наложить на него 2 ограничения FOREIGN KEY, указывающих на первичные ключи обеих этих таблиц. Я не знаю, как это оговорено в стандарте ANSI, но MSSQL позволяет вешать на одно поле таблицы несколько внешних ключей. Работать это будет, но так вы очень быстро занормализуетесь - в реальной жизни так никто не делает.
3 янв 13, 19:24    [13720110]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
Ennor Tiegael, alexeyvg, Glory, наверное

Всем большое спасибо! Буду делать 2 ограничения FOREIGN KEY, похоже ничего не остается )
3 янв 13, 19:50    [13720200]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
Ennor Tiegael
Если же вам таки надо это сделать, то совет уже дали - включить поле Код АК в первичные ключи таблиц Самолеты и Расписания, сделав их там составными. После этого добавить такое поле в таблицу рейсов и наложить на него 2 ограничения FOREIGN KEY, указывающих на первичные ключи обеих этих таблиц.
Может быть, лучше не включать в первичные ключи, а сделать альтернативный ключ. Не знаю, как на это посмотрит преподаватель :-) , но с практической точки зрения лучше так.
3 янв 13, 20:25    [13720293]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
Ennor Tiegael
Ваш пример просто очень упрощенно отображает действительность; данная схема не имеет смысла для БД самой авиакомпании, это скорее схема БД аэропорта либо контролирующего органа, типа РосАвиаци
Даже для них она неправильная, ведь рейс может выполняться другой АК.

Тут нужно внимательно читать задание и лекции, решение должно в данном случае соответствовать конкретному учебному заданию...
3 янв 13, 20:28    [13720303]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
alexeyvg
Ennor Tiegael
Если же вам таки надо это сделать, то совет уже дали - включить поле Код АК в первичные ключи таблиц Самолеты и Расписания, сделав их там составными. После этого добавить такое поле в таблицу рейсов и наложить на него 2 ограничения FOREIGN KEY, указывающих на первичные ключи обеих этих таблиц.
Может быть, лучше не включать в первичные ключи, а сделать альтернативный ключ. Не знаю, как на это посмотрит преподаватель :-) , но с практической точки зрения лучше так.
Вы, наверное, имели в виду "в кластерный индекс" :) Но вообще, конечно, да - выглядеть это будет менее громоздко.
alexeyvg
Даже для них она неправильная, ведь рейс может выполняться другой АК.

Тут нужно внимательно читать задание и лекции, решение должно в данном случае соответствовать конкретному учебному заданию...
Да, тут единственный реальный вопрос - "насколько полно мы моделируем действительность в этом курсаче?" Без ответа на него дальше лучше не двигаться.
3 янв 13, 20:37    [13720333]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
Ennor Tiegael
Вы, наверное, имели в виду "в кластерный индекс" :)
Нет, я про ПК.

Кластерный индекс - это вобще отдельная тема, может, он не будет иметь к ПК никакого отношения, или его на эту таблицу вообще не будет.

Просто в ПК это поле несколько излишне, мало ли, что будет ссылаться на таблицы Расписания и Самолёты, зачем туда тащить ещё одно ненужное поле?

А тут ссылка избыточная (в принципе это неправильно с точки зрения теории), но это нужно для контроля бизнес-правил без использования программного кода.
3 янв 13, 21:01    [13720429]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а я еще поднаброшу
в реальности бывает очень нужно и важно как раз позволить добавлять "кривые" данные (с точки зрения схемы хранения). ибо "так пришло на вход". а после добавления - валидировать и ставить ошибки. а валидация может быть очень сложной и реализоваться за пределами БД вообще. а не дадите добавить кривые данные - не на что и некуда будет ставить ошибку. что в итоге запросто усложнит весь процесс обработки "в масштабах предприятия".
с этой стороны - не смотрели?
3 янв 13, 21:04    [13720442]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
One_question, схема у Вас не правильная: в Рейсах не должно быть кода Расписания, это в Расписании должен быть внешний ключ по коду Рейса

1. Есть Авиакомпания;
2. У Авиакомпании есть несколько Самолётов;
3. Каждый Самолёт совершает несколько Рейсов;
4. Для каждого Рейса есть одно, или несколько Расписаний: летнее, зимнее и т.п.
4 янв 13, 01:12    [13721299]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
skyANA
One_question, схема у Вас не правильная: в Рейсах не должно быть кода Расписания, это в Расписании должен быть внешний ключ по коду Рейса
Наверное, под Рейсом здесь имеется в виду выполнение рейса конкретным самолётом (с определённым бортовым номером).

И я смотрю, что в Расписании есть ссылка на Маршрут

Видимо, то, что вы подразумеваете под Рейсом, тут называется Марщрутом.

А рейс - это как бы экземпляр выполнения расписания.
4 янв 13, 01:36    [13721376]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
skyANA
1. Есть Авиакомпания;
2. У Авиакомпании есть несколько Самолётов;
3. Каждый Самолёт совершает несколько Рейсов;
4. Для каждого Рейса есть одно, или несколько Расписаний: летнее, зимнее и т.п.


Т.е.
1. Есть Авиакомпания;
2. У Авиакомпании есть несколько Самолётов;
3. Авиакомпания составляет маршруты (то, что обычные пассажиры называют рейсами)
4. Для маршрута делается набор Расписаний
5. Для расписания на срок его действия формируются вылеты, называются Рейсы.
4 янв 13, 01:40    [13721389]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
alexeyvg, маршрут состоит из сегментов (рейсы).
Конкретный рейс зимой может вылетать в 10:00, а летом в 09:00.
ТС надо отделить рейсы от расписания.
4 янв 13, 02:14    [13721446]     Ответить | Цитировать Сообщить модератору
 Re: Проверочные ограничения  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
alexeyvg
3. Авиакомпания составляет маршруты (то, что обычные пассажиры называют рейсами)
Тогда уж авиакомпании составляют Есть маршруты, где один сегмент покрывает одна авиакомпания, а другой - другая.
4 янв 13, 02:32    [13721471]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить