Поиск: 
Ресурсы Обсуждения События Сервисы Опросы Сообщество
RSS-лента мобильная
версия
 
Главная страница :: Форум :: Тема «Бесплатные консультации: MySQL и другие (Interbase/Firebird, Informix...)»

Бесплатные консультации: MySQL и другие (Interbase/Firebird, Informix...)

Создал Алексей Локтев 9 октября 2008 г. в 21:24
в категории «Бесплатные уроки, консультации»
Не бросайте сюда скрипты ваших баз данных. Конкретный вопрос (теоретический, практический) конкретный ответ.


Комментарии (2)
 
 

Рейтинг 100
От Глеб Галкин, 11 октября 2008 г. в 23:13
у меня есть 6 таблиц. нужно ли мне задавать связь между ними (foreight key), или эту связь указывать в запросах?
ссылка на это сообщение
 
 
 

Рейтинг 115
От Алексей Локтев, 11 октября 2008 г. в 23:45
foreign key внешний ключ служит для сохранения ссылочной целостности БД.
Т.е. например, у нас в каждой строке таблицы факт начисления зарплаты кому-либо:
=== zarpl
dat date;
empl integer;
summa number;
здесь empl ссылка на работника, т.е. id (идентификатор) работника.
соответственно есть таблица с работниками:
=== empls
id integer;
fio char(50);
если построен внешний ключ с zarpl.empl на empls.id, то удаление работника, которому есть какие-то начисления, проходит «негладко».
Если внешний ключ построен с «каскадным удалением», то при удалении работника автоматически будут удаляться и все его начисления из zarpl.
Если внешний ключ «строгий», то при удалении работника, имеющего какие-либо начисления в zarpl, будет выдана ошибка.
Есть и другие варианты, не будем углубляться.

Грамотные проектировщики СУБД обязательно создают внешние ключи (если СУБД их поддерживает).
MySQL их поддерживает, например, для формата таблиц InnoDB.
Фактически, внешние ключи полностью отражают взаимоотношения между таблицами БД.
Именно на внешних ключах основаны алгоритмы работы средств, которые визуально отображают структуру БД. Потому что во внешних ключах ВСЁ.

Абсолютно логично выглядит идея, что в SQL-запросе таблицы связывать необязательно. Есть ведь внешние ключи... все связки и так ясны.
Однако, это не так.

Во-первых, в ANSI SQL никаких внешних ключей нет. Там вообще слишком мало есть:)
Поэтому, все разработчики СУБД наворотили кто во что горазд, и с синтаксисом, и с возможностями.
Но в существовании ANSI SQL есть важный момент простой SQL-запрос, написанный для скажем dBase, будет полностью работоспособным и в MySQL, и в Oracle.
Но в dBase нет внешних ключей и быть не может.
Было бы нестратегично в одних СУБД автоматом включать все внешние ключи как связки в запрос, а в других СУБД не включать:)

Во-вторых, одна таблица может входить в SQL-запрос несколько раз. И если связки расставляются автоматически, то что с чем связывать?...
Например, пусть в таблице с зарплатой есть ещё одно поле ссылка на бухгалтера по зарплате, который проводил начисление. Ясно, что это тоже ссылка на empls.
=== zarpl
dat date;
empl integer;
sum number;
buh integer;
Ну и пусть например есть внешние ключи zarpl.empl->empls.id, zarpl.buh->empls.id.
и вот мы пишем запросик:
select e.fio 'сотрудник', z.summa 'сумма', b.fio 'бухгалтер'
from zarpl z, empls e, empls b
where z.empl=e.id and z.buh=b.id
И как создать такие связки, имя информацию о внешних ключах?...
С чем связать z.empl? с таблицей "e" или с таблицей "b"?
ссылка на это сообщение
 

Цитатник

Всего 0 цитат из темы форума и её обсуждения.

©  www.e-learning.by
: el-info (at) e-learning by Пишите письма!: el-info (at) e-learning by