![]() |
|
Модераторы: LSD |
![]()
|
|
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 24 Всего: 538 |
Что-то я не пойму твою мысль. Дай пример таблиц, ключей и констрайнов.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Dremlin |
|
|||
|
Quo vadis? ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 21.9.2006 Где: Киев Репутация: нет Всего: 4 |
LSD, а чего там не понять?
ты делаешь: tbl1(id1), tbl2(id2, id1), tbl3(id3, id2), tbl4(id4, id3)... etc , а человеку удобнее: tbl1(id1), tbl2(id2, id1), tbl3(id3, id2, id1), tbl4(id4, id3, id2, id1)... etc хотя смысл подобных манипуляций от меня ускользает... --------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются... |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: 1 Всего: 5 |
Сорри, наоборот (первичные ключи): tbl1(id1), tbl2(id1, id2), tbl3(id1, id2, id3), tbl4(id1, id2, id3, id4)... В результате, при возникновении вопроса "мне нужны записи из tbl4, которые относятся к данной записи из tbl1 (то есть известно значение id1)", достаточно смотреть только на tbl4 |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 24 Всего: 538 |
Т.е. в tbl4 - колонки (id1, id2, id3, id4) будут составным первичным ключем? А какие будут foreign key?
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: 1 Всего: 5 |
Так они очевидны - первичный ключ предка
Например, у tbl4 это (id1, id2, id3), унаследованная часть первичного ключа. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 24 Всего: 538 |
А foreign key?
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: 1 Всего: 5 |
я о foreign key и говорю
Вот например отрывок:
и тд. Это сообщение отредактировал(а) Romkin - 14.11.2006, 23:49 |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 24 Всего: 538 |
Теперь возник вопрос: зачем надо было включать id1 и id2 в primary key?
Простой пользователь не должен синтетические ключи видеть вообще, а DBA не так уж и часто надо любоваться на PK, индекс по такому ключу менее эффективен. Вообщем я вижу только недостатки. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: 1 Всего: 5 |
Я уже сказал: упрощаются запросы. Это как минимум.
Например, если возникает задача выбрать записи из tbl4, которые принадлежат определенной записи из tbl1, в моем случае нужно сделать простой запрос к tbl4, id1 там есть и индексировано. Если бы этих полей не было, пришлось бы делать join трех таблиц, это - чтение трех индексов. Простой пользователь, разумеется, ключи не видит, а разработчик - у меня несколько людей смотрит структуру БД. И когда, смотря на таблицу, ты можешь сразу сказать, какое место в иерархии она занимает и с какими таблицами соединена, имхо, это большой плюс. ТО, что индекс менее эффективен - а насколько? Во сколько раз индекс по 4 полям integer менее эффективен, чем по 1-2? |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 24 Всего: 538 |
Каким образом включение id1, id2, id3 в primary key упрощает запросы? Добавлено @ 11:12
Это зависит от кучи факторов, и просто так сказать, что он менее эффективен в 2,36 раза нельзя. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Romkin |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: 1 Всего: 5 |
Рассмотрим следующий скрипт (примерный, многие поля в таблицах опущены):
Задача: Вывести из tbl1 Name и для каждого Name показать его сумму Price из таблицы tbl4. Решение:
Теперь рассмотрим другой скрипт, где ссылки - только на непосредственного предка:
Нужно то же самое. Можно, я не буду писать запрос с join всех этих таблиц? У меня получается, что в первом варианте скорость выше, несмотря на то, что индекс используется частично. На практике, конечно, немного сложнее (у меня tbl2 - соединение многие-многие двух таблиц, там еще другие запросы), но запросы иногда нужны примерно такие. |
||||||||
|
|||||||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 24 Всего: 538 |
Я не об этом.
В это топике обсуждается составные primary key, а не организация foreign key. Я спрашивал зачем нужно было включать поля id1, id2, id3 в primary key, а не зачем ты их добавил в таблицу tbl4 или сделал по ним foreign key. По поводу эффективности, не скажу за все СУБД, но в Oracle вот такой primary key:
будет использоваться только если идет запрос по первым полям, т.е.: id1 или id1, id2 или id1, id2, id3 или id1, id2, id3, id4. Если выборка идет по другой комбинации полей (например id2, id3), то индекс использоваться не будет, и будет full scan. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: 1 Всего: 5 |
Да, именно так. И именно поэтому я сразу указал порядок полей. И можно заметить, что в моих запросах в условии стоит первое поле первичного ключа. Хм. А кто начал спрашивать в десять вечера, какие foreign key у меня есть? Включаю я их в PK для по нескольким причинам: 1. Это набор полей, однозначно идентифицирующий запись. Можно заметить, я нигде не упоминал, что все они автоинкрементные. На мой взгляд, подобную иерархию на автоинкрементах и представить-то сложно 2. Для сохранения целостности: этим я явно показываю, какие записи могут быть в таблице. Разумеется, можно сделать, напрмиер в tbl4 один ключ id4 (если, подчеркиваю, это автоинкремент) и сделать ограничение уникальности (альтернативный ключ). Но это мне не надо: тогда индекс первичный ключа вообще в запросах участвовать не будет! Он не несет нужной информации. Только при выборке на клиент данной записи для редактирования, разве что (я не заржавею, написав для этого условие по 4 полям для составного ключа). 3. Для указания разработчику, с чем повязана эта таблица и как. Включение этих полей в ПК сразу подразумевает, что это именно подчиненная таблица, связь идентифицирующая, и вся работа с ней должна проходить с использованиемее предков. Плюс - перемещение записи между предками либо недопускается в реальности, либо чрезвычайно редкий сервис (я уже приводил пример, счет, состоящий из заголовка и содержимого. Нафиг содержимое перемещать? Или, например, это просто детализация записи мастера - тоже перемещать нет смысла). Конечно, разработчик всегда может посмотреть на схему данных, полная - на стене висит, два листа А0. И есть поблочная, листиков 30 А4... Как показывает прктика, уж лучше чтобы БД максимально подсказывала, что в ней есть. 4. Как показывает практика, выборки при схеме с составными ключами идут практически все по ним! Либо по первым полям, либо по всем. Немногие исключения - именно при унаследованной связи многие-многие, например, рассмотрим частично модифицированную схему:
Обращаю внимание: tbl3 - фактически связь двух таблиц, tbl2 и tblN (не показана, первичный ключ id3) поэтому в tbl4 унаследованы поля из этих же таблиц. При возникновении задачи "выбрать все поля из tbl4 для данной записи в tblN" поиск по первичному ключу не пойдет, поэтому введен индекс, второе поле в котором для, эээ... у меня id4 не автоинкремент, и тоже участвует, как правило, в запросах |
|||
|
||||
| chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 8 Всего: 77 |
В большинстве. Может, есть исключения, но я их пока не знаю... -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 24 Всего: 538 |
Я уже понял, что это было опрометчиво Мне не нравится:
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
![]()
|
| Правила форума "Общие вопросы по базам данных" | |
|
|
Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:
Данный форум не предназначен для:
Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение.
Полезные советы: Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | СУБД, общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |