Идентификаторы Visual FoxPro

Практически любая таблица имеет поле, специально выделенное для хранения значения, которое однозначно идентифицирует каждую запись. Вот это и есть идентификатор, он же “первичный ключ” (primary key). Например, в нашей таблице countries значение в поле idcountry соответствует названию страны. Значения в этом поле должны быть уникальными, неповторяющимися — не может быть двух стран с одинаковым названием.

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

Также нежелательно в качестве идентификатора человека использовать номер его паспорта — та же причина (человек существо беспокойное, он с легкостью может сменить паспорт, герб, флаг и даже пол…).

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

Теперь перед нами встает следующий вопрос: какого типа должны быть идентификаторы: символьного или числового?

Рассмотрим и те и другие.

Преимущества числовых идентификаторов:

• всегда точное сравнение, не зависящее от длины поля;

• для получения нового значения идентификатора достаточно произвести одну-единственную математическую операцию — “сложение”, и не нужно “выдумывать” никаких специальных функций.

Их недостатки:

• можно по неосторожности включить их в какие-то вычисления.

Преимущества символьных идентификаторов:

– они никогда не могут быть использованы в математических вычислениях;

• использование в идентификаторе сочетания цифровых и алфавитных символов значительно повышает его “емкость”.

Их недостатки:

• для генерации нового значения необходимо использовать специальные функции, здесь не удастся обойтись “простыми” математическими операциями;

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

Как видно, недостатки идентификаторов одного типа являются преимуществами другого, и наоборот.

Теперь обсудим такой вопрос: как произвести генерацию неповторяющихся значений? Первое, что приходит на ум — метод последовательного увеличения. Просто берем последнее значение и увеличиваем его на какую-то величину. Обычно используется два варианта:

– в таблице находится последнее значение (максимальное) и вычисляется следующее;

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

Спрашивается, почему для перехода на последнюю запись мы использовали Go RECCOUNTO? Есть же команда GO BOTTOM! А все дело в том, что функция RECCOUNTO возвращает количество физических записей в таблице, в то время как GO BOTTOM подвержена влиянию команд SET ORDER TO (порядок отображения индексированных записей) и SET FILTER TO (отображение записей, удовлетворяющих условию). А посему при применении GO BOTTOM нам пришлось бы где-то запомнить значение тегов и фильтра, “снять” их, а после перехода опять восстановить эти значения.

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

Недостатком этой процедуры является то, что пользователь может удалить какие-то записи, а затем при добавлении новых окажется, что данное значение идентификатора уже использовалось ранее. И если не задать условия сохранения ссылочной целостности — сам понимаешь, к чему это может привести.

Вот и все! Теперь у нас есть всего одна таблица, которая хранит значения идентификаторов для любого количества таблиц. Более того, данную функцию мы запишем как хранимую процедуру, входящую в состав нашей базы Данных.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100