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

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


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

SQL Exercises

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

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

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

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

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


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

§ Лидеры решали пропущенные задачи:
pаparome (задач 141, время на третьем этапе .049)

§ Продвинулись в рейтинге:
ValdemarES (135, 8.792)
Heromantor (133, 9.027)
Fomichev (132, 14.165)
Inuyasha (128, 1.883)
yuriy.rozhok (128, 17.336)
Lexus (124, 33.019)
loki (121, 12.968)

§ На этой неделе сертифицированы:
MoonRabbit (A07018343) [BK] (г.Москва, Россия)

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

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

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

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

Лучшие результаты (ТОР 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 04 May 2007
3 Шептунов П.П. (PavelPS) 142 142 21 341 119 8.145 3.499 14 25 Apr 2007 04 May 2007
4 Мурашкин И.В. (lepton) 142 142 21 341 371 15.737 5.539 14 29 Mar 2007 03 May 2007
5 Карасёва Н.В. (vlksm) 142 142 21 341 328 31.344 5.912 14 30 Mar 2007 03 May 2007
6 Голубин Р.С. (Roman S. Golubin) 142 142 21 341 588 55.391 34.203 14 29 Mar 2007 04 May 2007
7 Агапов В. (KERBEROS) 138 141 20 330 89 6.163 1.262 11 20 Nov 2006 09 Apr 2007
8 Кувалкин К.С. (Cyrilus) 140 141 20 334 867 12.518 2.519 11 10 Apr 2007 04 May 2007
9 Зверев Д.Л. (dimzv) 138 141 20 330 1141 9.294 4.938 11 19 Dec 2006 22 Dec 2006
10 Войнов П.Е. (pаparome) 141 68 21 337 616 2.751 .049 10 02 May 2007 03 May 2007
11 Тарасов Д.Б. (Gavrila) 138 140 21 330 577 20.220 .513 7 26 Mar 2007 04 May 2007
12 Мальцев А.В. (Палкин) 140 141 21 334 224 27.657 7.373 7 29 Mar 2007 02 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 04 May 2007
15 Юлдашев М.Р. (Snowbear) 139 139 21 330 642 4.132 .000 3 21 Apr 2007 04 May 2007
16 Креславский О.М. (Arcan) 139 139 21 330 67 9.932 .315 3 07 Apr 2007 29 Apr 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 04 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 >Haney (Davh) 60 60 112 34 146 484 04 May 2007
2 >Музыченко А.А. (Bl@de) 50 50 92 9 101 1166 04 May 2007
3 >Копылов Н.В. (NIKOP) 42 53 91 0 91 1151 04 May 2007
4 >Жуков Р.А. (ruskazhuk) 48 48 88 2 90 1452 04 May 2007
5 >Alyushin (Aligor) 32 57 69 20 89 680 04 May 2007
6 >Глазман А.В. (Malish) 39 39 74 9 83 1606 04 May 2007
7 >Одегов А.В. (avode) 44 44 79 0 79 1715 04 May 2007
8 >Князев В.В. (Kid2) 31 50 67 11 78 1131 04 May 2007
9 >Шередека А.В. (Noir) 32 50 69 9 78 1170 04 May 2007
10 >Янышев И.А. (Gektor) 31 50 67 9 76 1172 04 May 2007
11 Galieva (galiu) 38 38 65 9 74 1882 01 May 2007
12 Mugiwara (Mugiwara) 33 33 59 6 65 2231 04 May 2007
13 >Арасланов Е.И. (Рыжий) 33 34 52 11 63 2281 04 May 2007
14 >Koblov (Alexandr Koblov) 31 35 60 1 61 2259 04 May 2007
15 Щербинин А. (npecca@yahoo.com) 28 57 59 0 59 796 30 Apr 2007
16 >Игнатенко А.В. (red-boy) 32 32 59 0 59 2508 04 May 2007
17 Бондаренко Р.А. (roman_777) 29 29 52 5 57 2658 04 May 2007
18 Филатова Н. (filatova1987) 29 29 52 0 52 2964 03 May 2007
19 >aripova L.M. (cr-girl) 28 28 49 0 49 3153 04 May 2007
20 Бозунов Д.М. (Psychological) 27 27 47 0 47 3348 04 May 2007
21 Мельник А.А. (Kynlem) 27 27 47 0 47 3354 04 May 2007
22 Петряков Н. (s0n1k) 27 27 46 0 46 3398 03 May 2007
23 >Болотов Е.В. (3543) 26 26 44 1 45 3474 04 May 2007
24 >Москалев А.Г. (Enjoineer) 22 57 44 0 44 991 03 May 2007
25 Amudha T. (amudha) 15 31 35 9 44 2288 04 May 2007
26 >NEW_USER (NEWUSER) 25 26 42 1 43 3532 04 May 2007
27 >Rysev (MGR) 18 78 41 0 41 445 04 May 2007
28 Смирнов А.Ю. (lehasm) 21 27 40 0 40 3441 01 May 2007

Изучаем SQL

Десять характерных ошибок в проектировании базы данных

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

Никакой список ошибок не будет исчерпывающим. Люди (включая и меня самого) допускают время от времени множество действительно глупых вещей, пытаясь что-то сделать. Данный список просто отражает ошибки в проектировании базы данных, с которыми я недавно столкнулся или с которыми я постоянно сталкиваюсь.

Замечание:

Я уже дважды поднимал эту тему. Если Вы хотите послушать подкаст-версию, посетите блестящий сайт Грэга Лоу SQL Down Under . Я также представил урезанную десятиминутную версию в PASS для Simple-Talk. Первоначально их было десять, потом шесть, а сейчас опять десять. Но эти десять не те же самые десять ошибок, которые были первоначально; они отражают мое сегодняшнее понимание.

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

Итак, список:

  1. Плохой проект/планирование
  2. Игнорирование нормализации
  3. Слабые стандарты именования
  4. Отсутствие документации
  5. Одна таблица для хранения всех значений домена
  6. Использование столбцов identity/guid в качестве единственного ключа
  7. Не использование средств SQL для поддержания целостности данных
  8. Не использование хранимых процедур для обеспечения доступа к данным
  9. Попытка генерировать объекты
  10. Недостаточное тестирование

Плохой проект/планирование

"Если Вы не знаете, куда идете, то любая дорога приведет вас туда" - Джордж Харрисон

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

Позвольте мне спросить: Вы наняли бы подрядчика для строительства дома, чтобы потребовать от него заливать фундамент на следующий же день? Или что хуже, Вы потребовали бы, чтобы это было сделано без плана или проекта дома? Хочется надеяться, что Вы ответили "Нет" на оба вопроса. Проект необходим как гарантия, что дом, который Вы хотите, будет построен, и что земля, на которой Вы строите его, не провалится в какую-нибудь подземную пещеру. Если Вы ответили "Да", я не уверен, поможет ли Вам то, что я собираюсь рассказать.

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

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

Слишком часто надлежащая фаза планирования игнорируется в пользу "получения сделанного". Когда по какому-либо направлению проект встречает преграду, и неизбежно возникают проблемы из-за нехватки надлежащего проектирования и планирования, то нет "никакого времени", чтобы вернуться, дабы исправить ситуацию должным образом, используя надлежащие методы. Поскольку когда начинается "рубка", благие обещания возвратиться и исправить кое-что позже, выполняются, на самом деле, очень редко.

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

Игнорирование нормализации

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

Концепция нормализации в течение около 30 лет является основанием, на которое опирается SQL и реляционные базы данных. Другими словами, SQL был создан для работы с нормализованными структурами данных. Нормализация - это не только некий заговор программистов баз данных против прикладных программистов (что является просто побочным эффектом!)

SQL весьма аддитивен по своей природе; это проявляется в том, что если Вы имеете биты и элементы данных, то легко создать множество значений или результатов. В предложении FROM Вы берете набор данных (таблицу) и добавляете (JOIN) его к другой таблице. Вы можете собрать вместе столько наборов данных, сколько вам угодно, чтобы произвести необходимое вам окончательное множество.

Эта аддитивная природа чрезвычайно важна не только для простоты разработки, но также и для производительности. Индексы являются наиболее эффективными, когда они могут работать со всем ключевым значением. Всякий раз, когда Вам нужно использовать SUBSTRING, CHARINDEX, LIKE и так далее, чтобы вытащить значение, которое объединено с другими значениями в едином столбце (например, чтобы вычленить фамилию человека из столбца, содержащего полное имя), парадигма SQL начинает ломаться, и данные становятся всё менее доступными для поиска.

Итак, нормализация ваших данных существенна для хорошей производительности и простоты разработки, но остался вопрос: "Какой нормализации достаточно?" Если Вы читали какие-нибудь книги по нормализации, то Вы слышали много раз, что существенной является 3-я Нормальная Форма, но действительно полезны и 4-ые и 5-ые Нормальные Формы и, как только Вы сталкиваетесь с ними, не жалейте времени, требуемого на нормализацию.

Однако в действительности часто оказывается, что не всегда даже первая Нормальная Форма создается правильно.

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

Всегда ли имеется 12 платежей (Payment)? Существенен ли порядок платежей? Имеет ли NULL-значение смысл НЕИЗВЕСТНО (пока еще не заполнен), или это означает пропущенную оплату? И когда оплата была сделана?!?

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

В этом втором проекте каждый столбец хранит единственную единицу информации о единственной "вещи" (оплата), и каждая строка представляет конкретный случай оплаты.

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

(продолжение следует...)

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

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

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

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

Контакты

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

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

В избранное