Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / связь много ко многим / 25 сообщений из 31, страница 1 из 2
07.05.2012, 00:52
    #37784895
gr_vl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
Извините если фотоп но не смог найти
Есть реализация отношений много ко многим через дополнительную таблицу
те есть например
tblOtdel
tblSotrudnic

естьь таблица для их связи tblOtdelSotrud
idFOtdel --> на первичный ключ tblOtdel
idFSotrudnic --> на первичный ключ tblSotrudnic

нужно ли в таблице tblOtdelSotrud первичный ключ?
Что лучше использовать в качестве первичного ключа кластерный индекс по idFOtdel, idFSotrudni или новое поле с автоинкриментом?

Может существуют другие варианты для высоконагруженных запросов?


Григорий

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
07.05.2012, 16:16
    #37785314
Максим Н
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
gr_vlнужно ли в таблице tblOtdelSotrud первичный ключ?
Обычно нет, но все зависит от запросов
...
Рейтинг: 0 / 0
07.05.2012, 16:18
    #37785318
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
gr_vlестьь таблица для их связи tblOtdelSotrud
idFOtdel --> на первичный ключ tblOtdel
idFSotrudnic --> на первичный ключ tblSotrudnic

нужно ли в таблице tblOtdelSotrud первичный ключ?Там, где допускается не более одной связи между сущностями, первичный ключ делают сразу из обоих этих полей.
...
Рейтинг: 0 / 0
07.05.2012, 16:52
    #37785345
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
естьь таблица для их связи tblOtdelSotrud
idFOtdel --> на первичный ключ tblOtdel
idFSotrudnic --> на первичный ключ tblSotrudnic

нужно ли в таблице tblOtdelSotrud первичный ключ?

В любой таблице всегда должен быть первичный ключ. Эта таблица -- не исключение.

Что лучше использовать в качестве первичного ключа кластерный индекс по idFOtdel, idFSotrudni или новое поле с автоинкриментом?

Два поля, (idFOtdel, idFSotrudnic).

Может существуют другие варианты для высоконагруженных запросов?

Для высоконагруженных или нет -- большой разницы нет.
...
Рейтинг: 0 / 0
07.05.2012, 18:24
    #37785427
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
gr_vl Что лучше использовать в качестве первичного ключа кластерный индекс по idFOtdel, idFSotrudni или новое поле с автоинкриментом?Об этот вопрос обломано немало копий. Как минимум еще есть комбинация idFSotrudni,idFOtdel. По поводу кластерного индекса тоже все неоднозначно.
...
Рейтинг: 0 / 0
07.05.2012, 18:41
    #37785434
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
> Об этот вопрос обломано немало копий. Как минимум еще есть комбинация
> idFSotrudni,idFOtdel. По поводу кластерного индекса тоже все неоднозначно.

И что ж там неоднозначно? Этот первичный ключ будет чуть ли не единственным
индексом в этой таблице, и к тому же он первичный ключ. Ну, возможно нужен
будет ещё обратный индекс: (idFOtdel,idFSotrudni).
Либо один, либо другой надо делать первичным ключём, и один из них надо
делать кластерным, если это MSSQLServer.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.05.2012, 19:10
    #37785453
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
MasterZiv Либо один, либо другой надо делать первичным ключём, и один из них надо делать кластерным, если это MSSQLServer.Либо не надо делать кластерный индекс, либо таки завести суррогатный ключ и его сделать кластерным плюс два индекса и т.д.
Что лучше, пусть ТС сам выбирает, информации недостаточно, тем более для высоконагруженных запросов

Но в любом случае я категорически согласен с MasterZiv В любой таблице всегда должен быть первичный ключ. Эта таблица -- не исключение.
...
Рейтинг: 0 / 0
07.05.2012, 19:58
    #37785500
Бредятина
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
MasterZivестьь таблица для их связи tblOtdelSotrud
idFOtdel --> на первичный ключ tblOtdel
idFSotrudnic --> на первичный ключ tblSotrudnic

нужно ли в таблице tblOtdelSotrud первичный ключ?

В любой таблице всегда должен быть первичный ключ. Эта таблица -- не исключение.

Что лучше использовать в качестве первичного ключа кластерный индекс по idFOtdel, idFSotrudni или новое поле с автоинкриментом?

Два поля, (idFOtdel, idFSotrudnic).

Может существуют другие варианты для высоконагруженных запросов?

Для высоконагруженных или нет -- большой разницы нет.
Слишком категорично про два поля:)
Однозначно нельзя сказать со слов автора - связь это или сущность.
Если сущность, то должен быть свой идентификатор (к сожалению, идентификаторов нет в реляционных системах).
Если связь, то ограничения на два внешних ключа "регулируют" мощность связи. Другими словами, все связи следует представлять отдельной таблицей, независимо от их мощности. И получается, что автор задал не совсем тот вопрос:)
...
Рейтинг: 0 / 0
07.05.2012, 23:13
    #37785604
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
> Либо не надо делать кластерный индекс, либо таки
завести суррогатный ключ и его
> сделать кластерным плюс два индекса и т.д.

До тех пор, пока на эту таблицу нет ссылок, что редко бывает,
сурогатный ключ там 100% не нужен.

> Что лучше, пусть ТС сам выбирает, информации недостаточно, тем более /для
> высоконагруженных запросов/

Запросы тут ни при чём.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.05.2012, 23:14
    #37785606
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
> Если сущность, то должен быть свой идентификатор (к сожалению, идентификаторов
> нет в реляционных системах).

Может быть свой идентификатор. А может и не быть.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.05.2012, 00:37
    #37785631
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
MasterZiv
> Об этот вопрос обломано немало копий. Как минимум еще есть комбинация
> idFSotrudni,idFOtdel. По поводу кластерного индекса тоже все неоднозначно.

И что ж там неоднозначно? Этот первичный ключ будет чуть ли не единственным
индексом в этой таблице, и к тому же он первичный ключ. Ну, возможно нужен
будет ещё обратный индекс: (idFOtdel,idFSotrudni).
Либо один, либо другой надо делать первичным ключём, и один из них надо
делать кластерным, если это MSSQLServer.

Я бы еще предложил добавить по одному индексу на каждый внешний ключ...
Не зависимо от платформы...
...
Рейтинг: 0 / 0
08.05.2012, 00:41
    #37785635
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
MasterZivЛибо один, либо другой надо делать первичным ключём, и один из них надо
делать кластерным, если это MSSQLServer.

Кстати, у Oracle подобное называется "индекс-организованные таблицы"...
...
Рейтинг: 0 / 0
08.05.2012, 00:50
    #37785638
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
> Я бы еще предложил добавить по одному индексу на каждый внешний ключ...

А именно ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.05.2012, 00:50
    #37785639
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
> Кстати, у Oracle подобное называется "индекс-организованные таблицы"...

Да ты чё ? Крутта!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.05.2012, 01:05
    #37785650
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
sphinx_mvНе зависимо от платформы...
Эт ты погорячился... Некоторые SQL сервера создают индексы на FK самостоятельно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.05.2012, 01:31
    #37785660
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
MasterZiv
> Я бы еще предложил добавить по одному индексу на каждый внешний ключ...

А именно ?

Если из этого примера, то один - по idFOtdel, второй - по idFSotrudnic...
Не считая составного первичного/уникального по обоим этим полям.
...
Рейтинг: 0 / 0
08.05.2012, 01:33
    #37785663
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
Dimitry Sibiryakovsphinx_mvНе зависимо от платформы...
Эт ты погорячился... Некоторые SQL сервера создают индексы на FK самостоятельно.

А это как-то отменяет факт наличия соответствующего индекса?
Это всего лишь означает, что его в-ручную не надо делать, но сам индекс - необходим.
...
Рейтинг: 0 / 0
08.05.2012, 11:14
    #37785826
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
sphinx_mvЭто всего лишь означает, что его в-ручную не надо делать

Но ты-то как раз написал, что его надо обязательно создавать вручную, независимо от
платформы...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.05.2012, 11:54
    #37785864
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
> > Я бы еще предложил добавить по одному индексу на каждый внешний ключ...
>
> А именно ?
>
>
> Если из этого примера, то один - по idFOtdel, второй - по idFSotrudnic...
> Не считая составного первичного/уникального по обоим этим полям.

Эти индексы не нужны, если есть оба индекса по двум полям:
(idFOtdel,idFSotrudnic)
и
(idFSotrudnic,idFOtdel)

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.05.2012, 11:57
    #37785867
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
> Но ты-то как раз написал, что его надо обязательно создавать вручную, независимо от
> платформы...

Ну мы-то естественно подразумеваем, что "добавить" значит чтобы индекс в итоге
был, а не чтобы его кто-то добавлял ;-)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.05.2012, 14:00
    #37786006
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
MasterZiv
> > Я бы еще предложил добавить по одному индексу на каждый внешний ключ...
>
> А именно ?
>
>
> Если из этого примера, то один - по idFOtdel, второй - по idFSotrudnic...
> Не считая составного первичного/уникального по обоим этим полям.

Эти индексы не нужны, если есть оба индекса по двум полям:
(idFOtdel,idFSotrudnic)
и
(idFSotrudnic,idFOtdel)


Может, я и не прав, но "обратный" индекс я бы добавлял в последнюю очередь - когда уж совсем "прижмет", и именно он "спасет"...
...
Рейтинг: 0 / 0
08.05.2012, 14:55
    #37786044
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
> Может, я и не прав, но "обратный" индекс я бы добавлял в последнюю очередь -
> когда уж совсем "прижмет", и именно он "спасет"...

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

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.05.2012, 16:11
    #37786130
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
MasterZiv
> Может, я и не прав, но "обратный" индекс я бы добавлял в последнюю очередь -
> когда уж совсем "прижмет", и именно он "спасет"...

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

В некотором роде это заблуждение...

Начиная с того, что индекс может использоваться только если оптимизатор посчитает, что он достаточно эффективен для этого. Если, конечно, не рассматривать вариант с "ручным" прописыванием хинтов (которое даже не всегда срабатывает)...
И заканчивая тем, что "среднепотолочная" селективность и стоимость, что "прямого", что "обратного" индексов примерно одинаковы. Следовательно, пользы от подобной "копии" можно даже не пытаться предполагать.

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

Таким образом, мы схему схеме "много-во-много", когда в соответствующей таблице имеются один составной уникальный индекс или первичный ключ и по одному индексу на коминацию полей для каждого внешнего ключа.
...
Рейтинг: 0 / 0
08.05.2012, 16:50
    #37786189
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
On 05/08/2012 05:11 PM, sphinx_mv wrote:

Мне как бы надоело спорить по пустякам, но ...

> И заканчивая тем, что "среднепотолочная" селективность и стоимость, что
> "прямого", что "обратного" индексов примерно одинаковы. Следовательно, пользы от
> подобной "копии" можно даже не пытаться предполагать.

Если у тебя одни запросы используют ТОЛЬКО одно поле, а другие -- ТОЛЬКО другое,
тут как бы выбора нет (если таблица большая, конечно, а не 20-30 строк).

> К тому, же я уже сталкивался с тем, что в некоторых серверах БД просто
> запрещается создавать индексы с одинаковым набором полей (независимо от их
> порядка).

Давай пример. Не верю.

А для некоторых других серверов это очень открытым текстом просто не
> рекомендуют делать...

Давай пример. Не верю.

> При всем этом создание индексов по полям, участвующим во внешних ключах,
> является вполне устоявшейся и рекомендуемой практикой.

Не всегда это нужно. Но некоторые СУБД действительно принудительно
их создают.

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

Напиши полный список индексов, с полями, и с их порядком.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.05.2012, 02:54
    #37786614
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь много ко многим
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> Таким образом, мы схему схеме "много-во-много", когда в соответствующей таблице
> имеются один составной уникальный индекс или первичный ключ и по одному индексу
> на коминацию полей для каждого внешнего ключа.

Напиши полный список индексов, с полями, и с их порядком.
Афигеть! В таблице аж два поля!..
Вам действительно настолько проблематично самостоятельно "нарисовать" один составной индекс с любым из двух вариантов первого/второго поля и два простых?
Мне не сложно - мне лень... Хотя, по ходу дела, я их уже все равно расписал...
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / связь много ко многим / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]