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

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


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

SQL Exercises

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

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

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

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

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


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

§ Davh предложил изменение еще двух английских формулировок для задач 52 и 78. При этом формулировка задачи 52 кардинально отличается от русскоязычного аналога. Теперь в случае проблем с пониманием задачи имеет смысл прочитать обе формулировки :-).

§ Лидеры решали добавленные задачи:
Cyrilus (задач 141, время на третьем этапе 2.519)

§ Новые лица в сотне:
modicus (задач 120, время 5.347)
Xthysq (120, 5.787)
runaway (118, 13.073)
Alex Wolker (123, 44.978)

§ Продвинулись в рейтинге:
Ocean (135, 46.545)
Lexus (126, 37.651)
Madest (121, 45.578)

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

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

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

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

Лучшие результаты (ТОР 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 17 May 2007
3 Шептунов П.П. (PavelPS) 142 142 21 341 119 8.145 3.499 14 25 Apr 2007 18 May 2007
4 Мурашкин И.В. (lepton) 142 142 21 341 371 15.737 5.539 14 29 Mar 2007 09 May 2007
5 Карасёва Н.В. (vlksm) 142 142 21 341 328 31.344 5.912 14 30 Mar 2007 18 May 2007
6 Голубин Р.С. (Roman S. Golubin) 142 142 21 341 588 55.391 34.203 14 29 Mar 2007 18 May 2007
7 Агапов В. (KERBEROS) 138 141 20 330 89 6.163 1.262 11 20 Nov 2006 09 Apr 2007
8 Кувалкин К.С. (Cyrilus) 141 77 20 336 901 12.656 2.519 11 14 May 2007 17 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 17 May 2007
12 Мальцев А.В. (Палкин) 140 141 21 334 224 27.657 7.373 7 29 Mar 2007 07 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 18 May 2007
15 Юлдашев М.Р. (Snowbear) 139 139 21 330 642 4.132 .000 3 21 Apr 2007 18 May 2007
16 Креславский О.М. (Arcan) 139 139 21 330 67 9.932 .315 3 07 Apr 2007 18 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 18 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 >Антонов А.Ю. (Andanto) 57 57 109 6 115 922 18 May 2007
2 >М А.А. (GRR) 59 59 111 0 111 971 18 May 2007
3 >Гречкин А.А. (GrAnD) 36 36 66 28 94 1410 18 May 2007
4 >Юрин П. (Apostol Pavel) 36 36 66 28 94 1411 18 May 2007
5 Nesto I. (Marka) 43 43 79 0 79 1750 16 May 2007
6 >warlock9000 (warlock9000) 40 40 75 0 75 1876 18 May 2007
7 Парфенов Ю.В. (Onisim) 37 40 65 8 73 1822 18 May 2007
8 >Титов Д.Ю. (Dragon999) 32 86 66 0 66 277 18 May 2007
9 Maximius (Maximius) 32 32 59 0 59 2547 16 May 2007
10 >Лаптиев И.Л. (Xthysq) 22 120 54 0 54 80 18 May 2007
11 Шершов (ASh^) 21 53 43 10 53 888 18 May 2007
12 >Kazantsev K. (Uni) 29 29 52 0 52 3037 18 May 2007
13 >Zubko (Dear God) 29 29 52 0 52 3048 18 May 2007
14 Башлыков В.В. (VetaleG) 14 58 30 20 50 656 18 May 2007
15 Мытников (danielm) 28 28 49 0 49 3229 15 May 2007
16 tsv (fenya13) 28 28 49 0 49 3261 17 May 2007
17 Гладков Д.А. (3DManiak) 18 38 44 3 47 1921 14 May 2007
18 >Pepanashvili T. (tsiko) 27 31 44 0 44 2780 18 May 2007
19 >Pr (ЛП) 16 24 28 15 43 3083 18 May 2007
20 zero (rockmanzero) 26 26 43 0 43 3642 18 May 2007
21 >Шеожева О.А. (~Olga) 25 25 40 0 40 3863 18 May 2007

Изучаем SQL

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

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

Одна таблица для хранения всех значений домена

"Одно Кольцо, чтобы управлять ими всеми и в темноте связывать их"

Это все замечательно и хорошо с точки зрения знания фантастики, но не настолько хорошо, когда речь идет о проекте базы данных в форме "управляющей" таблицы доменов. Реляционные базы данных опираются на фундаментальную идею, согласно которой каждый объект представляет одну и только одну сущность. Никогда не должно быть никакого сомнения относительно того, к какой части данных идет обращение. Отслеживание связи от имени столбца к имени таблицы, к первичному ключу, должно легким и определенно указывать, что означает та или иная часть данных.

Большой миф, созданный архитекторами, которые на самом деле не понимают архитектуру реляционной базы данных (включая и меня на заре карьеры), заключается в утверждении, что чем больше имеется таблиц, тем более сложным будет проект. Как раз наоборот, разве упаковывание таблиц в единственную "всеобъемлющую" таблицу упрощает проект?

Рассмотрим, например, следующую часть модели, где мне нужны доменные значения для:

  • Customer CreditStatus (состояние кредита клиента)
  • Customer Type (тип клиента)
  • Invoice Status (состояние счета)
  • Invoice Line Item BackOrder Status (состояние возврата заказа пункта строки счета)
  • Invoice Line Item Ship Via Carrier (доставка курьером пункта строки счета)

    Это может показаться очень прозрачным и естественным способом проектирования таблицы со всех точек зрения, но имеется проблема в не очень естественной работе с помощью SQL. Скажем, мы хотим получить доменные значения только для таблицы Customer:

    SELECT *
    FROM Customer
         JOIN GenericDomain as CustomerType
             ON Customer.CustomerTypeId = CustomerType.GenericDomainId
             and CustomerType.RelatedToTable = 'Customer'
             and CustomerType.RelatedToColumn = 'CustomerTypeId'
         JOIN GenericDomain as CreditStatus
             ON Customer.CreditStatusId = CreditStatus.GenericDomainId
             and CreditStatus.RelatedToTable = 'Customer'
             and CreditStatus.RelatedToColumn = ' CreditStatusId'

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

    Итак, вместо единственной таблицы для всех доменов, Вы могли бы смоделировать это так:

    Выглядит сложнее, не так ли? Но это первоначальное впечатление. Откровенно говоря, мне потребуется больше времени, чтобы описать подробно таблицы примера. Однако появились огромные преимущества:

    · Использование данных в запросе стало намного проще:

    SELECT *
    FROM Customer
         JOIN CustomerType
             ON Customer.CustomerTypeId = CustomerType.CustomerTypeId
         JOIN CreditStatus
             ON Customer.CreditStatusId = CreditStatus.CreditStatusId

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

    · Если оказывается, что Вы должны хранить больше информации о ShipViaCarrier (доставке курьером), чем только код ('UPS') и описание ( 'United Parcel Service'), то вы можете просто добавить столбец или два. Вы могли бы даже расширить таблицу, чтобы дать полную информацию о бизнесе, представленном курьерами.

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

    · Вы по-прежнему можете иметь один редактор для всех строк, поскольку большинство доменных таблиц будет вероятно иметь одну и ту же базовую структуру/использование. Правда, вы теряете способность легко получить все доменные значения в одном запросе, но к чему вам это? (Запрос с объединением мог бы легко быть создан из этих таблиц, если это понадобится, но это представляется маловероятным.)

    Я должен, вероятно, опровергнуть мысль, которая может у вас возникнуть. "Что, если мне понадобится добавить новый столбец ко всем доменным таблицам?" Например, Вы забыли, что клиенту потребуется выполнить пользовательскую сортировку по доменным значениям и ничего не предусмотрели в таблицах, чтобы иметь возможность реализовать это. Справедливый вопрос, особенно если Вы имеете 1000 таких таблиц в очень большой базе данных. Но, во-первых, это редко случается, и когда это имеет место, то в любом случае вам придется вносить существенные изменения в вашу базу данных.

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

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

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

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

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

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

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

    Контакты

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

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

    В избранное