|
|
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
Извините если фотоп но не смог найти Есть реализация отношений много ко многим через дополнительную таблицу те есть например tblOtdel tblSotrudnic естьь таблица для их связи tblOtdelSotrud idFOtdel --> на первичный ключ tblOtdel idFSotrudnic --> на первичный ключ tblSotrudnic нужно ли в таблице tblOtdelSotrud первичный ключ? Что лучше использовать в качестве первичного ключа кластерный индекс по idFOtdel, idFSotrudni или новое поле с автоинкриментом? Может существуют другие варианты для высоконагруженных запросов? Григорий Модератор: Тема перенесена из форума "Microsoft SQL Server". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2012, 00:52 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
gr_vlнужно ли в таблице tblOtdelSotrud первичный ключ? Обычно нет, но все зависит от запросов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2012, 16:16 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
gr_vlестьь таблица для их связи tblOtdelSotrud idFOtdel --> на первичный ключ tblOtdel idFSotrudnic --> на первичный ключ tblSotrudnic нужно ли в таблице tblOtdelSotrud первичный ключ?Там, где допускается не более одной связи между сущностями, первичный ключ делают сразу из обоих этих полей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2012, 16:18 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
естьь таблица для их связи tblOtdelSotrud idFOtdel --> на первичный ключ tblOtdel idFSotrudnic --> на первичный ключ tblSotrudnic нужно ли в таблице tblOtdelSotrud первичный ключ? В любой таблице всегда должен быть первичный ключ. Эта таблица -- не исключение. Что лучше использовать в качестве первичного ключа кластерный индекс по idFOtdel, idFSotrudni или новое поле с автоинкриментом? Два поля, (idFOtdel, idFSotrudnic). Может существуют другие варианты для высоконагруженных запросов? Для высоконагруженных или нет -- большой разницы нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2012, 16:52 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
gr_vl Что лучше использовать в качестве первичного ключа кластерный индекс по idFOtdel, idFSotrudni или новое поле с автоинкриментом?Об этот вопрос обломано немало копий. Как минимум еще есть комбинация idFSotrudni,idFOtdel. По поводу кластерного индекса тоже все неоднозначно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2012, 18:24 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
> Об этот вопрос обломано немало копий. Как минимум еще есть комбинация > idFSotrudni,idFOtdel. По поводу кластерного индекса тоже все неоднозначно. И что ж там неоднозначно? Этот первичный ключ будет чуть ли не единственным индексом в этой таблице, и к тому же он первичный ключ. Ну, возможно нужен будет ещё обратный индекс: (idFOtdel,idFSotrudni). Либо один, либо другой надо делать первичным ключём, и один из них надо делать кластерным, если это MSSQLServer. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2012, 18:41 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
MasterZiv Либо один, либо другой надо делать первичным ключём, и один из них надо делать кластерным, если это MSSQLServer.Либо не надо делать кластерный индекс, либо таки завести суррогатный ключ и его сделать кластерным плюс два индекса и т.д. Что лучше, пусть ТС сам выбирает, информации недостаточно, тем более для высоконагруженных запросов Но в любом случае я категорически согласен с MasterZiv В любой таблице всегда должен быть первичный ключ. Эта таблица -- не исключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2012, 19:10 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
MasterZivестьь таблица для их связи tblOtdelSotrud idFOtdel --> на первичный ключ tblOtdel idFSotrudnic --> на первичный ключ tblSotrudnic нужно ли в таблице tblOtdelSotrud первичный ключ? В любой таблице всегда должен быть первичный ключ. Эта таблица -- не исключение. Что лучше использовать в качестве первичного ключа кластерный индекс по idFOtdel, idFSotrudni или новое поле с автоинкриментом? Два поля, (idFOtdel, idFSotrudnic). Может существуют другие варианты для высоконагруженных запросов? Для высоконагруженных или нет -- большой разницы нет. Слишком категорично про два поля:) Однозначно нельзя сказать со слов автора - связь это или сущность. Если сущность, то должен быть свой идентификатор (к сожалению, идентификаторов нет в реляционных системах). Если связь, то ограничения на два внешних ключа "регулируют" мощность связи. Другими словами, все связи следует представлять отдельной таблицей, независимо от их мощности. И получается, что автор задал не совсем тот вопрос:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2012, 19:58 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
> Либо не надо делать кластерный индекс, либо таки завести суррогатный ключ и его > сделать кластерным плюс два индекса и т.д. До тех пор, пока на эту таблицу нет ссылок, что редко бывает, сурогатный ключ там 100% не нужен. > Что лучше, пусть ТС сам выбирает, информации недостаточно, тем более /для > высоконагруженных запросов/ Запросы тут ни при чём. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2012, 23:13 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
> Если сущность, то должен быть свой идентификатор (к сожалению, идентификаторов > нет в реляционных системах). Может быть свой идентификатор. А может и не быть. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2012, 23:14 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
MasterZiv > Об этот вопрос обломано немало копий. Как минимум еще есть комбинация > idFSotrudni,idFOtdel. По поводу кластерного индекса тоже все неоднозначно. И что ж там неоднозначно? Этот первичный ключ будет чуть ли не единственным индексом в этой таблице, и к тому же он первичный ключ. Ну, возможно нужен будет ещё обратный индекс: (idFOtdel,idFSotrudni). Либо один, либо другой надо делать первичным ключём, и один из них надо делать кластерным, если это MSSQLServer. Я бы еще предложил добавить по одному индексу на каждый внешний ключ... Не зависимо от платформы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2012, 00:37 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
MasterZivЛибо один, либо другой надо делать первичным ключём, и один из них надо делать кластерным, если это MSSQLServer. Кстати, у Oracle подобное называется "индекс-организованные таблицы"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2012, 00:41 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
> Я бы еще предложил добавить по одному индексу на каждый внешний ключ... А именно ? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2012, 00:50 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
> Кстати, у Oracle подобное называется "индекс-организованные таблицы"... Да ты чё ? Крутта! Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2012, 00:50 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
sphinx_mvНе зависимо от платформы... Эт ты погорячился... Некоторые SQL сервера создают индексы на FK самостоятельно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2012, 01:05 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
MasterZiv > Я бы еще предложил добавить по одному индексу на каждый внешний ключ... А именно ? Если из этого примера, то один - по idFOtdel, второй - по idFSotrudnic... Не считая составного первичного/уникального по обоим этим полям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2012, 01:31 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovsphinx_mvНе зависимо от платформы... Эт ты погорячился... Некоторые SQL сервера создают индексы на FK самостоятельно. А это как-то отменяет факт наличия соответствующего индекса? Это всего лишь означает, что его в-ручную не надо делать, но сам индекс - необходим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2012, 01:33 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
sphinx_mvЭто всего лишь означает, что его в-ручную не надо делать Но ты-то как раз написал, что его надо обязательно создавать вручную, независимо от платформы... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2012, 11:14 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
> > Я бы еще предложил добавить по одному индексу на каждый внешний ключ... > > А именно ? > > > Если из этого примера, то один - по idFOtdel, второй - по idFSotrudnic... > Не считая составного первичного/уникального по обоим этим полям. Эти индексы не нужны, если есть оба индекса по двум полям: (idFOtdel,idFSotrudnic) и (idFSotrudnic,idFOtdel) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2012, 11:54 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
> Но ты-то как раз написал, что его надо обязательно создавать вручную, независимо от > платформы... Ну мы-то естественно подразумеваем, что "добавить" значит чтобы индекс в итоге был, а не чтобы его кто-то добавлял ;-) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2012, 11:57 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
MasterZiv > > Я бы еще предложил добавить по одному индексу на каждый внешний ключ... > > А именно ? > > > Если из этого примера, то один - по idFOtdel, второй - по idFSotrudnic... > Не считая составного первичного/уникального по обоим этим полям. Эти индексы не нужны, если есть оба индекса по двум полям: (idFOtdel,idFSotrudnic) и (idFSotrudnic,idFOtdel) Может, я и не прав, но "обратный" индекс я бы добавлял в последнюю очередь - когда уж совсем "прижмет", и именно он "спасет"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2012, 14:00 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
> Может, я и не прав, но "обратный" индекс я бы добавлял в последнюю очередь - > когда уж совсем "прижмет", и именно он "спасет"... Это любой индекс надо так добавлять, но вообще-то таблица реализует связь "многие-ко-многим", и обычно связь используется в БД для "прохода" как от таблицы А к таблице В, так и наоборот, от таблицы В к таблице А. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2012, 14:55 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
MasterZiv > Может, я и не прав, но "обратный" индекс я бы добавлял в последнюю очередь - > когда уж совсем "прижмет", и именно он "спасет"... Это любой индекс надо так добавлять, но вообще-то таблица реализует связь "многие-ко-многим", и обычно связь используется в БД для "прохода" как от таблицы А к таблице В, так и наоборот, от таблицы В к таблице А. В некотором роде это заблуждение... Начиная с того, что индекс может использоваться только если оптимизатор посчитает, что он достаточно эффективен для этого. Если, конечно, не рассматривать вариант с "ручным" прописыванием хинтов (которое даже не всегда срабатывает)... И заканчивая тем, что "среднепотолочная" селективность и стоимость, что "прямого", что "обратного" индексов примерно одинаковы. Следовательно, пользы от подобной "копии" можно даже не пытаться предполагать. К тому, же я уже сталкивался с тем, что в некоторых серверах БД просто запрещается создавать индексы с одинаковым набором полей (независимо от их порядка). А для некоторых других серверов это очень открытым текстом просто не рекомендуют делать... При всем этом создание индексов по полям, участвующим во внешних ключах, является вполне устоявшейся и рекомендуемой практикой. Таким образом, мы схему схеме "много-во-много", когда в соответствующей таблице имеются один составной уникальный индекс или первичный ключ и по одному индексу на коминацию полей для каждого внешнего ключа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2012, 16:11 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
On 05/08/2012 05:11 PM, sphinx_mv wrote: Мне как бы надоело спорить по пустякам, но ... > И заканчивая тем, что "среднепотолочная" селективность и стоимость, что > "прямого", что "обратного" индексов примерно одинаковы. Следовательно, пользы от > подобной "копии" можно даже не пытаться предполагать. Если у тебя одни запросы используют ТОЛЬКО одно поле, а другие -- ТОЛЬКО другое, тут как бы выбора нет (если таблица большая, конечно, а не 20-30 строк). > К тому, же я уже сталкивался с тем, что в некоторых серверах БД просто > запрещается создавать индексы с одинаковым набором полей (независимо от их > порядка). Давай пример. Не верю. А для некоторых других серверов это очень открытым текстом просто не > рекомендуют делать... Давай пример. Не верю. > При всем этом создание индексов по полям, участвующим во внешних ключах, > является вполне устоявшейся и рекомендуемой практикой. Не всегда это нужно. Но некоторые СУБД действительно принудительно их создают. > Таким образом, мы схему схеме "много-во-много", когда в соответствующей таблице > имеются один составной уникальный индекс или первичный ключ и по одному индексу > на коминацию полей для каждого внешнего ключа. Напиши полный список индексов, с полями, и с их порядком. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2012, 16:50 |
|
||
|
связь много ко многим
|
|||
|---|---|---|---|
|
#18+
MasterZivМне как бы надоело спорить по пустякам, но ... > И заканчивая тем, что "среднепотолочная" селективность и стоимость, что > "прямого", что "обратного" индексов примерно одинаковы. Следовательно, пользы от > подобной "копии" можно даже не пытаться предполагать. Если у тебя одни запросы используют ТОЛЬКО одно поле, а другие -- ТОЛЬКО другое, тут как бы выбора нет (если таблица большая, конечно, а не 20-30 строк). В таблице связей (из 2 полей) нужно иметь 3 (три!) индекса... Один из них - составной ПК(ПОЛЕ1,ПОЛЕ2), два других - по полям внешних ключей ИНД1(ПОЛЕ1) и ИНД2(ПОЛЕ2). Любой из этих индексов может быть (а может и НЕ быть) использован при выполнении любых запросов из таблиц, участвующих в этой реализации схемы "много-во-много". И что не так? MasterZiv> К тому, же я уже сталкивался с тем, что в некоторых серверах БД просто > запрещается создавать индексы с одинаковым набором полей (независимо от их > порядка). Давай пример. Не верю. Ну, Информикс. Полегчало? Попытка создания друг за другом двух индексов вида ИНД1(ПОЛЕ1,ПОЛЕ2) и ИНД2(ПОЛЕ2,ПОЛЕ1), помнится (давно было дело), приводила к ошибке с сообщением о наличии в БД индекса с повторяющимся набором полей. MasterZiv А для некоторых других серверов это очень открытым текстом просто не > рекомендуют делать... Давай пример. Не верю. Все тот же Информикс - и это было раз... Оракл - а это было два... Как раз читаю апресовское издание "Expert Oracle Database Architecture" Тома Кайта - на 488 странице подробно аккурат про это написано... MasterZiv> При всем этом создание индексов по полям, участвующим во внешних ключах, > является вполне устоявшейся и рекомендуемой практикой. Не всегда это нужно. Но некоторые СУБД действительно принудительно их создают. Принудительное создание индексов для внешних ключей - это будет по-круче, чем просто "рекомендуемая практика"... Это будет уже " настоятельно рекомендуемая практика"... Даже если, кому-то покажется, что это "не всегда нужно"... MasterZiv> Таким образом, мы схему схеме "много-во-много", когда в соответствующей таблице > имеются один составной уникальный индекс или первичный ключ и по одному индексу > на коминацию полей для каждого внешнего ключа. Напиши полный список индексов, с полями, и с их порядком. Афигеть! В таблице аж два поля!.. Вам действительно настолько проблематично самостоятельно "нарисовать" один составной индекс с любым из двух вариантов первого/второго поля и два простых? Мне не сложно - мне лень... Хотя, по ходу дела, я их уже все равно расписал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2012, 02:54 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37785434&tid=1541687]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
188ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 218ms |
| total: | 522ms |

| 0 / 0 |
