Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Новости сайта "Упражнения по SQL" (http://www.sql-ex.ru) 141


Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 141 (26 мая 2007 г.)

SQL Exercises

Новым посетителям сайта

Сайт посвящен изучению языка, с помощью которого осуществляется взаимодействие с реляционными (и не только) СУБД. Суть обучения состоит в выполнении заданий на написание запросов к учебным базам данных; при этом система контролирует правильность выполнения заданий. В настоящее время реализованы все операторы подъязыка манипуляции данными (DML), которые включают в себя оператор извлечения данных SELECT, а также операторы модификации данных - INSERT, DELETE и UPDATE.

Мы надеемся, что справочного материала сайта окажется достаточно для самостоятельного обучения. Кроме того, свои решения вы можете обсудить на форуме сайта. Опытных же специалистов приглашаем проверить (продемонстрировать) свое мастерство и принять участие в соревновании, обеспечиваемом рейтинговой системой учета времени выполнения заданий. Фактически, рейтинг ведется на втором этапе тестирования, который начинается сейчас после решения 57-ти задач первого этапа. При подсчете рейтинга каждого участника отбрасывается один самый худший показатель среди всех решенных им упражнений.

Демонстрация плана выполнения запроса и сравнительная оценка эффективности решений поможет вам освоить принципы оптимизации запросов, которые пригодятся на третьем рейтинговом этапе.

Имеется возможность получить сертификат по SQL DML при выполнении определенного количества заданий.


Новости сайта

§ Davh продолжил править английские формулировки по мере продвижения в рейтинге. На этот раз это коснулось задачи 79.
Пошел на поводу у VetaleG и переуточнил формулировку задачи 67 :-).

§ Разместил на страницах сайта кнопочку Сохранение закладок(ниже блока для голосования), которая предоставляет возможность выбирать ресурс для сохранения закладок на сайты. Правда в списке отсутствуют ресурсы зоны RU.

§ Продвинулись в рейтинге:
Fomichev (133, 14.199)
Xthysq (125, 7.476)
modicus (задач 124, время 7.284)
runaway (124, 13.763)
Alex Wolker (124, 47.333)

§ На этой неделе сертифицированы:
VetaleG (A07017268) [BK] (г.Королёв, МО, Россия)

§ Число подписчиков - 3543

Число участников рейтинга - 10466

Число участников второго этапа - 977

Сертифицировано на сайте - 157

Лучшие результаты (ТОР 20)

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Северюхин Ю.А. (Venser) 142 142 21 341 36 4.912 .655 14 08 Apr 2007 04 May 2007
2 Солдатенков Ю.С. (SolYUtor) 142 142 21 341 320 17.807 2.695 14 03 Apr 2007 24 May 2007
3 Шептунов П.П. (PavelPS) 142 142 21 341 119 8.145 3.499 14 25 Apr 2007 23 May 2007
4 Мурашкин И.В. (lepton) 142 142 21 341 371 15.737 5.539 14 29 Mar 2007 22 May 2007
5 Карасёва Н.В. (vlksm) 142 142 21 341 328 31.344 5.912 14 30 Mar 2007 25 May 2007
6 Голубин Р.С. (Roman S. Golubin) 142 142 21 341 588 55.391 34.203 14 29 Mar 2007 23 May 2007
7 Агапов В. (KERBEROS) 138 141 20 330 89 6.163 1.262 11 20 Nov 2006 09 Apr 2007
8 Кувалкин К.С. (Cyrilus) 141 141 20 336 901 12.656 2.519 11 14 May 2007 24 May 2007
9 Зверев Д.Л. (dimzv) 138 141 20 330 1141 9.294 4.938 11 19 Dec 2006 22 Dec 2006
10 Войнов П.Е. (pаparome) 141 142 21 337 616 2.765 .049 10 02 May 2007 14 May 2007
11 Тарасов Д.Б. (Gavrila) 138 140 21 330 577 20.220 .513 7 26 Mar 2007 25 May 2007
12 Мальцев А.В. (Палкин) 140 141 21 334 224 27.657 7.373 7 29 Mar 2007 21 May 2007
13 Васьков Е.В. (Johan) 140 140 21 334 253 12.786 11.402 7 29 Mar 2007 09 Apr 2007
14 Валуев Д.И. (Fiolent) 139 140 20 329 1329 117.088 62.302 4 25 Apr 2007 25 May 2007
15 Юлдашев М.Р. (Snowbear) 139 139 21 330 642 4.132 .000 3 21 Apr 2007 21 May 2007
16 Креславский О.М. (Arcan) 139 139 21 330 67 9.932 .315 3 07 Apr 2007 22 May 2007
17 Держальцев В.А. (MadVet) 135 139 20 321 540 34.190 3.085 3 08 Oct 2006 19 Oct 2006
18 Палий С.А. (PS_Sergey) 136 139 20 322 212 15.704 4.188 3 01 Dec 2006 03 Dec 2006
19 Солопов А.Н. (15th) 138 138 21 327 125 16.082 .000 0 25 Apr 2007 25 May 2007
20 Бородкина М.И. (marishkin) 138 138 21 327 145 19.015 .000 0 10 Apr 2007 03 May 2007

Лучшие результаты за неделю

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Веретенцев М.В. (X_a_m) 64 64 119 0 119 883 25 May 2007
2 majidov N.B. (tgu) 53 53 102 0 102 1182 20 May 2007
3 >Севидова Е. (NetLenka) 43 43 78 17 95 1409 25 May 2007
4 oleks O. (oles) 49 49 92 0 92 1465 24 May 2007
5 >b (tatka) 40 40 72 17 89 1525 25 May 2007
6 lui C. (carrie lui) 42 42 74 3 77 1817 25 May 2007
7 >Монтлевич Е.К. (L_Kit) 41 41 74 3 77 1821 25 May 2007
8 >Small E.V. (Лори) 37 37 68 3 71 2032 25 May 2007
9 >t G.K. (tgk) 33 33 62 0 62 2419 25 May 2007
10 Chyoo (Pikachyoo) 34 34 62 0 62 2421 24 May 2007
11 >Молвичев А.С. (Молвичев А.С.) 34 34 62 0 62 2425 25 May 2007
12 >Якушин С.Н. (KREST) 29 29 52 3 55 2891 25 May 2007
13 >Дикопавленко А.О. (alex_Blazzkovich) 31 31 52 0 52 3071 25 May 2007
14 >Бабчинецкий А.В. (Babrick) 25 59 51 0 51 977 25 May 2007
15 >Zubko (Dear God) 21 50 40 9 49 1209 25 May 2007
16 >Sherstnyuk A. (Leto) 28 28 49 0 49 3307 25 May 2007
17 >Belogurova (Katy_Ekb) 27 27 46 0 46 3487 25 May 2007
18 Троценко С.И. (sergey75) 24 24 37 9 46 3506 25 May 2007
19 >Карелин Р.Г. (Roman Karelin) 26 26 43 0 43 3673 25 May 2007
20 >Anton (Atton) 25 25 40 0 40 3904 25 May 2007
21 >Bases N.M. (astinus) 23 23 35 5 40 3907 25 May 2007

Изучаем SQL

Десять характерных ошибок в проектировании базы данных (продолжение, начало в вып.138)

Louis Davidson (оригинал: Ten Common Database Design Mistakes )
Перевод Моисеенко С.И.

Использование столбцов identity/guid в качестве единственного ключа

Первая Нормальная Форма диктует, что все строки в таблице должны однозначно идентифицироваться. Следовательно, каждая таблица должна иметь первичный ключ. SQL Server позволяет Вам определить числовой столбец как столбец IDENTITY, после чего автоматически генерируются уникальные значения для каждой добавляемой строки. Кроме того, Вы можете использовать NEWID () (или NEWSEQUENTIALID ()) для генерации случайного 16-байтового уникального значения для каждой строки. Такие типы значений, когда они используется как ключи, называются суррогатными ключами. Слово "суррогатный" означает "что-либо для замены", и в данном случае, суррогатный ключ должен стать заменой естественного ключа.

Проблема состоит в том, что слишком много проектировщиков используют столбец суррогатного ключа в качестве единственного ключевого столбца на данной таблице. Значения суррогатного ключа не представляют никакого фактического значения в реальном мире; они предназначены исключительно для того, чтобы однозначно идентифицировать каждую строку.

Давайте рассмотрим следующую таблицу Part, в которой PartID является столбцом IDENTITY и первичным ключом таблицы:

PartID PartNumber Description
1 XXXXXXXX Часть X
2 XXXXXXXX Часть X
3 YYYYYYYY Часть Y

Сколько рядов находится в этой таблице? Ну, кажется, что три, однако не являются ли строки с PartIDs 1 и 2 фактически одной и той же строкой, т.е. дубликатами? Или же это две различных строки, которые должны быть уникальными, но были определены неправильно?

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

В качестве правила: каждая из ваших таблиц должна иметь естественный ключ, который что-то означает для пользователя и может уникально идентифицировать каждую строку в вашей таблице. В очень редких случаях, когда Вы не можете найти естественный ключ (возможно, например, для таблицы, которая обеспечивает регистрацию событий), тогда используйте искусственный/суррогатный ключ.

Не использование средств SQL для поддержания целостности данных

Все фундаментальные, неизменные бизнес-правила должны быть реализованы средствами реляционного механизма. Основные правила допустимости NULL значений, длины строки, назначения внешних ключей, и так далее, все должны быть определены в базе данных.

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

Правила, которые являются дополнительными, с другой стороны, являются верными кандидатами на то, чтобы переместить их в бизнес-слой приложения. Рассмотрим, например, такое правило: "В первую половину месяца никакая деталь не может быть продана с больше чем 20%-ой скидкой без одобрения менеджера".

В целом, эти правило звучит не очень четко, не очень хорошо контролируется, и подвержено частым изменениям. Например, что произойдет, когда на следующей неделе максимальная скидка составит 30 %? Или когда определение "первой половины месяца" изменится на "от 15 дней до 20 дней"? Наиболее вероятно, что Вы не захотите переносить трудности реализации этих сложных временных бизнес-правил в код SQL Server; бизнес-слой - лучше место, чтобы реализовать такие правила там.

Однако рассмотрите правило более внимательно. Тут есть элементы, которые, вероятно, никогда не будут изменяться. Например.
· Максимальная скидка, которая когда-либо может быть предложена
· Факт, что предлагающий ее должен быть менеджером

Эти аспекты бизнес-правила очевидно должны предписываться базой данных и схемой. Даже если сущность правила применяется в бизнес-слое, Вам все же потребуется иметь таблицу в базе данных, в которую записывается размер скидки, дата, когда она предлагалась, идентификатор личности, который ее одобрил и так далее. На столбце Discount Вы должны иметь ограничение CHECK, которое ограничит допустимые значения интервалом между 0.00 и 0.90 (или любым другим максимумом). Мало того, что это применит ваше правило "максимальной скидки", но также будет служить средством защиты от пользователя, входящего скидку 200 % или отрицательную скидку по ошибке. На столбце ManagerID Вы должны поместить ограничение внешний ключа, который ссылаются на таблицу менеджеров (Managers), и гарантирует, что введенный идентификатор соответствует личности реального менеджера (или, как альтернативу, триггер, который выбирает только те EmployeeIds, которые соответствуют менеджерам).

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

 

SELECT CASE WHEN discount < 0 then 0 else WHEN discount > 1 then 1…

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

(окончание следует...)

Полезная информация

§ Все статьи, публикуемые в рассылке, затем выкладываются на сайте Книги и статьи по SQL.

§ В продаже еще имеется книга SQL. Задачи и решения, посвященная анализу ошибок, допускаемых при решении задач первого этапа. На сайте издательства Питер можно сделать заказ и познакомиться с содержанием.

§ Желающих поспособствовать популяризации сайта прошу проголосовать/поставить закладку в социальных сетях:
del.icio.us
dzone.com
Digg.com
Reddit.com

Контакты

По всем вопросам, связанным с функционированием сайта, проблемами при решении упражнений, идеями вы можете обращаться к Сергею И.Моисеенко msi77@yandex.ru. Вы также можете предложить свои задачи для публикации на сайте.

Подписка Subscribe.Ru
Новости сайта "Упражнения по SQL"

В избранное