Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2008, 19:18   #1
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию БД. Индексы и ключи

Здравствуйте. Я не могу разобраться, что такое первичный ключ, внешний ключ и индексы, для чего они нужны и какая между ними разница? Объясните, пожалуйста.
Сергей089 вне форума Ответить с цитированием
Старый 22.09.2008, 19:22   #2
VVM
Форумчанин
 
Аватар для VVM
 
Регистрация: 06.06.2007
Сообщений: 282
По умолчанию

http://lessons-tva.info/edu/e-inf2/m2t4.html

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

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

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

Существует три типа первичных ключей: ключевые поля счетчика (счетчик), простой ключ и составной ключ.

Поле счетчика (Тип данных «Счетчик»). Тип данных поля в базе данных, в котором для каждой добавляемой в таблицу записи в поле автоматически заносится уникальное числовое значение.

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

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

Необходимо еще раз отметить, что в поле первичного ключа должны быть только уникальные значения в каждой строке таблицы, т.е. совпадение не допускается, а в поле вторичного или внешнего ключа совпадение значений в строках таблицы допускается.
Не важно, как часто вы падаете. Важно, как часто вы поднимаетесь. Винс Ломбарди.
VVM вне форума Ответить с цитированием
Старый 22.09.2008, 19:26   #3
VVM
Форумчанин
 
Аватар для VVM
 
Регистрация: 06.06.2007
Сообщений: 282
По умолчанию

вот еще, там про индексы есть: http://www.codenet.ru/progr/vbasic/vb_db/1.php
Не важно, как часто вы падаете. Важно, как часто вы поднимаетесь. Винс Ломбарди.
VVM вне форума Ответить с цитированием
Старый 22.09.2008, 20:32   #4
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

Спасибо! Почитаю. Индекс нужен для быстрого поиска, а ключ, чтобы не было абсолютно одинаковых записей. Если я не прав, поправьте меня.
Сергей089 вне форума Ответить с цитированием
Старый 22.09.2008, 21:30   #5
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

В общем, да, но лучше не увлекаться ключами и индесками. Имхо.
Для идентификации записи лучше сделать поле increment (напр. имя поля = id). Например, у меня есть два Иванова Ивана Ивановича, проживающего по одному адресу. Как их идентифицировать? Если по какому-то из полей есть ключ - при добавлении вылетит ошибка.
А по id - без проблем.
DELETE FROM TABLE WHERE ID=TABLEID.TEXT. Ошибки быть не может.
А индекс нужен не столько для поиска - сколько для связи с другой таблицей.
Функции GoToKey и GoToNearest - фуфло. К тому же требуют наличие индексированного поля.
Locate() - индексированного поля не требует, но сделает переход к одной и той-же записи и не выведет список всего найденного. Вывод: используем sql-запросы.

Последний раз редактировалось _SERGEYX_; 22.09.2008 в 21:34.
_SERGEYX_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ключи veter_s_morya SQL, базы данных 1 30.06.2008 15:33
Надстрочные индексы в RichEdit Serega_P Общие вопросы Delphi 4 20.06.2008 11:34
Индексы AlexDoul БД в Delphi 12 24.11.2007 16:52
Индексы Таня84 БД в Delphi 4 20.03.2007 14:09