За статьей последует разбор моих собственных ошибок по этой теме, допущенных в одном старом проекте. Я был молод и глуп, но это меня не извиняет. Честно говоря, прочитав эту статью и не заметив, кто автор, я подумал, что он все же преувеличивает и вообще, я без него как- нибудь разберусь, где и какие ключи мне использовать. Потом я еще немного подумал и полез за дампом структуры базы моего старого проекта. Было интересно. Если вы опытный DBA, наверное, вам стоит пройти мимо, чтобы не расстраиваться. Но обо всем по порядку. Сначала ОЧЕНЬ сокращенный перевод: «Суррогатные числовые ключи попали в стандарт SQL8.
Microsoft Access – полнофункциональная реляционная СУБД, которая. Для каждой таблицы можно определить первичный ключ – одно или. Составной ключ необходим в случае, если невозможно гарантировать уникальность записи с. Наличие ключа в таблице исключает возможность появления в ней двух одинаковых записей. Здравствуйте! Столкнулся с такой проблемой: имеется БД, в ней таблица "Товары" (поля: КодТовара - ключ, Марка, ЕдиницаИзмерения .
Впоследствии в разговоре с Джо Селко, Кодд сказал, что жалеет, что допустил это. Неопытные разработчики, не понимая, что использование суррогатные ключей является прагматичным компромиссом с соображениями производительности, используют их везде. Даже авторы книг по базам данных советуют обязательно создавать их во всех таблицах в любом случае.
В теории реляционных баз данных нет понятия первичных ключей. Все ключи базы данных имеют одинаковую значимость. Понятие первичного ключа базируется на представлении, что один и только один ключ определяет порядок кортежей на диске, а реляционная теория говорит нам о том, что как раз это мы должны игнорировать в логической модели наших данных. Poets Of The Fall Lift Rapidshare. Так что, первичные ключи вообще – это нарушение реляционной теории.
Я не говорю о том, что суррогатные ключи нельзя использовать вообще, я говорю о том, что нельзя злоупотреблять их использованием. Какие причины могут побудить нас использовать суррогатные ключи?
Компромисс с многоколоночными ключами. Обычно, довольно убедительна. Синтаксис SQL запросов с использованием многоколоночных ключей и механизм соединений в настоящее время оставляет желать много лучшего, как и производительность запросов такого рода. Как только эти проблемы будут решены, данная причина отпадет. У данных нет реального ключа.
Очень плохая причина. Ее появление иллюстрирует как плохой дизайн базы данных в целом, таки и то, что разработчик на самом деле не понимает данных, с которыми работает. Внешние требования.
Обычно убедительна. Как правило, среды разработки и инструменты для работы с базами данных поддерживают только суррогатные ключи. И если вы считаете, что данный инструмент незаменим в проблеме, которую вы решаете, что ж. Обычно убедительна. Но только в том случае, если вы действительно скрупулезно следуете плану и весь ваш дизайн тщательно спланирован. Следование SQL стандарту и принципам хорошего дизайна. Очень плохая причина.
Она полностью основана на невежестве. Обычно, ей следуют потому, что где- то услышали, как кто- то прочитал в блоге кого- то, кто учится в УНИВЕРСИТЕТЕ, что использование суррогатных ключей – это стандарт в индустрии.
Имейте ввиду, что ни современные стандарты SQL, ни сама реляционная теория не содержит даже упоминания о суррогатных ключах. Возможность легкого изменения.
Действительно, некоторые СУБД не умеют выполнять ON UPDATE CASCADE или делают это слишком неэффективно (кстати, подумайте об этом как о причине смены СУБД). И в этом случае, данная причина может оказаться весомой. Однако иногда разработчики говорят о том, что ключи . Имейте ввиду, что это утверждение яйца выеденного не стоит и уж, разумеется, полностью отсутствует в реляционной теории. Производительность. Обычно плохая причина. Да, действительно, могут возникать ситуации, в которых использование естественных ключей сильно замедляет работу системы по сравнению с суррогатными.
Но в 8. 0% случаев за этим утверждением не стоят реальные тесты и подобное утверждение остается безосновательным. Предварительная оптимизация – корень многих бед в дизайне баз данных. Для баз данных мега- объема результирующий размер таблицы также может иметь значение. Но для этого база должна быть уж очень большой.
Производительность соединений или сортировки также имеет значение на большом количестве данных, в зависимости от типа первичного ключа и числа его компонентов. Однако мой опыт показывает, что когда называют эту причину, за ней очень редко стоят реальные расчеты или замеры производительности.
Например, www. bricolage. Однако и в этом случае, после появления пользователя с трехмиллионной записью в истории, когда встал вопрос об изменении первичных ключей ради производительности, эта проблема была решена переписыванием запросов.
Было достигнуто примерно 1. Обратите внимание, что проблемы причиняет не использование суррогатных ключей, а злоупотребление ими».
Конец моего ОЧЕНЬ СОКРАЩЕННОГО перевода. Оригинал тут (Primary Keyvil называется): it. Primary+kevill%2. Type=5. Если я упустил что- то важное в переводе, пожалуйста, скажите мне об этом. Добавлю. Теперь немного о том, что я сам думаю. Все же статья показалось мне немного драматизирующей проблему. Мне кажется, что суррогатные ключи выбираются все чаще всего именно из- за того, чтобы избежать проблем с производительностью впоследствии и в последнее время все так к ним привыкли, что они насаждаются на уровне самих СУБД.
Например, Inno. DB, если вы не создадите первичный ключ, просто создаст его сама. Кстати, в случае с Inno. DB выбор первичного ключа имеет серьезные последствия с точки зрения производительности, поскольку по нему производится кластеризация (соответственно, выбор естественного ключа может как улучшить, так и ухудшить ситуацию). Несмотря на то, что статья звучит так, будто суррогатные ключи суть воплощенное зло, автор несколько раз подчеркивает, что проблему несет не их использование, а злоупотребление ими. Эта статья открыла мне глаза в том плане, что я всегда считал естественным не искать себе особых кандидатов в первичные ключи, а просто создать INT NOT NULL AUTO. Разумеется, я знал о том, что в качестве первичного ключа можно выбрать любой уникальный ключ, но я никогда на этом не акцентировался. Я никогда особо не задумывался о том, что вообще по- настоящему делает данную строку базы данных уникальной и почему это важно.
Как выяснилось, зря. В качестве примера я хочу вам привести свой небольшой старый проект. Там всего несколько таблиц. Вначале я хотел выбрать что- то побольше, но думаю, что это лишнее. Только напрасно отниму у вас время. Пусть каждый сам откроет какой- нибудь свой старый проект и посмотрит на него с точки зрения описанной позиции.
Я там на самом деле добавил одну ошибку сейчас справедливости ради. Я бы ее все равно сделал. Меня спасла только случайность. Проект представляет собой некоторый закрытый торрент- трекер. Я прошу вас не обращать сейчас внимание на проблемы с нормализацией и всякие другие. Если бы я писал его сейчас, может быть, кое- что я бы сделал по- другому. Давайте сосредоточимся на суррогатных ключах.
Структура базы данныхpastebin. Lst. H8. Xfx. Первая таблица, о которой я бы хотел поговорить, это таблица логов. Вообще, именно этот случай меня немного ошарашил что ли, поскольку я неожиданно увидел ошибку. Совсем небольшую, не стоящую особого внимания, но, тем не менее, это ошибка, которой я не замечал много- много лет. Совсем не замечал. Отвлекитесь сейчас от текста и вернитесь к структуре этой таблицы. Я не видел. В этой таблице хранится простая информация.
IP, ID пользователя, дата возникновения события и его текст. Да, конечно, текст можно было заменить кодом и сделать много еще чего, но речь сейчас не об этом.
После прочтения статьи, я посмотрел на эту таблицу и подумал, что, вот я создал суррогатный ключ. Но каков реальный ключ данных? Что делает конкретную строку таблицы уникальной?
Ответ очень простой. Комбинация из ID пользователя и времени возникновения события. И вот тут я неожиданно увидел ситуацию с другой стороны. Практически во всех моих старых проектах поле DATETIME используется для хранения времени в логах. Просто потому, что это удобно. Да, я знал, что оно хранится с точностью до секунды и меня это полностью устраивало.
Сейчас, когда я начал искать естественные ключи, мне неожиданно пришло в голову, какие последствия это несет.
В процессе конвертации базы до версии 4. Удалите записи, нарушающие уникальность ключа. Удалите записи, нарушающие уникальность ключа. Удалите записи, нарушающие уникальность ключа. Используя приведённую ниже инструкцию, Вы не переделываете пакет импорта под новые требования, а просто исправляете препятствие для конвертации, удаляя дублирующие записи из списков соответствий параметров пакетов импорта.
В связи с этим дальнейшем может потребоваться доработка соответствующего пакетов импорта. Скачайте архив по ссылке под текстом данной статьи, распакуйте его содержимое в отдельную папку. В папке будет 5 файлов, название каждого из них будет содержать версию базы данных.
Импортируйте в Вашу базу данных информацию из файла, номер версии в названии которого соответствует номеру версии базы, использующейся в Вашей версии Business Studio (соответствия номеров версий Business Studio можно посмотреть в Истории версий). Далее откройте справочник . Iptv Player Triolan Харьков. В окне с результатами фильтра записи будут отсортированы по убыванию значения в колонке . Для каждой из строк со значением > 1 необходимо: Вызвать от ячейки колонки . Сделать скриншот открывшегося окна, сохранить его (он может понадобиться потом для изучения требуемой логики работы этого пакета импорта, в соответствии с которой надо будет внести правки в пакет в версии 4. Личные Ключевые Роли'>Личные Ключевые Роли.
Удалить строки с одинаковыми значениями параметра . Выполните фильтр . В окне с результатами фильтра записи будут отсортированы по убыванию значения в колонке . Для каждой из строк со значением > 1 необходимо: Вызвать от ячейки колонки . Открыть справочник . На этом этапе возможно 2 результата, для каждого из которых дальнейшие действия будут свои: Если в окне поиска ссылок пусто, закройте его и удалите строку справочника . Если в окне поиска ссылок есть строка: Откройте её свойства по кнопке на верхней панели окна поиска ссылок.
Вызовите от заголовка выведенной на показ колонки . В окне настройки пакета импорта откройте вкладку .
Отобразите колонки . Найдите записи- дубли с одинаковыми значениями в обеих этих колонках и удалите неактуальную запись с заменой ссылок на актуальную, выбирая соответствующий пункт в окне удаления. Повторите предыдущий пункт для всех дублей. Попробуйте провести конвертацию этой базы данных.