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

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

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

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


Григорий

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

А именно ?

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
связь много ко многим
    #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]