powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Нужен ли primary key в таблице, организующей связь один ко многим?
25 сообщений из 58, страница 1 из 3
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37410036
Sozonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица, связывающая авто и запчасти, т.е. одному авто может соответствовать много запчастей:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `test` (
  `car` int( 11 ) NOT NULL,
  `part` int( 11 ) NOT NULL,
  `level` int( 11 ) NOT NULL,
  `params` text COLLATE utf8_unicode_ci NOT NULL,
  KEY `car` (`car`)
)

Нужно ли в этой таблице поле id (primary key) ?

Выборки происходят по полю car
Апдейты по car и part
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37410099
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sozonov,

нужен ли в таблице суррогатный ключ - знать никто кроме вас не может. Естественный ключ у вас тут напрашивается (car, part).
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37410133
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 24.08.2011 16:45, Sozonov wrote:

PK нужен в любой таблице.

> Нужно ли в этой таблице поле id (primary key) ?

Если на эту таблицу-связку не ссылаются другие таблицы,
то отдельный суррогатный ключ в таких таблицах точно не нужен.
Если на таблицу-связку есть ссылки, то можно подумать о том,
чтобы его добавить, т.е. он может быть нужен, а может быть и
нет. Зависит это от того, сколько таблиц ссылается на данную,
чем больше, тем более он нужен (больше экономия).
Но допустимы оба варианта дизайна.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37410153
Фотография Светлый_Дайвер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
PK нужен в любой таблице.



Не правда.

2Sozonov
Это твоя таблица test таблица связывающая машину и её части - так?
Причем запчастей одних и тех же может быть куча, так как отсутствует поле count.
Стало быть здесь всякие PK/AK никому не нужны.

А вот про индексы подумать нужно...
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37410194
Sozonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Светлый_Дайвер
Не правда.

2Sozonov
Это твоя таблица test таблица связывающая машину и её части - так?
Причем запчастей одних и тех же может быть куча, так как отсутствует поле count.
Стало быть здесь всякие PK/AK никому не нужны.

А вот про индексы подумать нужно...

Да, эта таблица связывает машины и запчасти.
Каждой машине соответствует несколько запчастей (записи из таблицы parts), но у авто всегда одна запчасть каждого типа.
Иначе говоря: у каждой машины по 11 запчастей, разный только уровень запчасти (поле level ) и некоторые запчасти имеют специфические параметры (поле params )

По индексам:
Выборка из таблицы идет всегда по полю car , т.е.
Код: plaintext
SELECT `part`, `level`, `params` FROM `test` WHERE `car` =  12892 
Удаления очень редки и происходят тоже только по полю car .
По UPDATE `ам: они проходят по полям `car` и `part` :
Код: plaintext
UPDATE `test` SET `level` =  3 , `params` = 'some params' WHERE `car`=  3123  AND `part` =  7 

В данный момент создан только индекс по полю car .
Прочел недавно, что у индексов используется левая часть, т.е. индекс (`car`, `part`) будет использован при запросе
Код: plaintext
SELECT `part`, `level`, `params` FROM `test` WHERE `car` =  12892 
Это верно?
Если это так, то действительно лучше создать индекс (`car`, `part`), тогда он поможет также про update.

Прав ли я?
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37410222
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sozonov,

да. Сделайте (car,part) первичным кластерным ключем и не мучьте животное.
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37410501
Goffman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sozonov,

если собираешься ссылаться на эту таблицу, тогда да, иначе нет смысла
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37410749
Kyubee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно. Нехорошо, когда pk меняется (и вообще, когда несёт какую-то дополнительную нагрузку кроме идентификации записи)
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37423351
BVB_berserk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не применительно именно к данной задаче, но в общем случае, одна запчасть может подходить на несколько машин.
Поэтому я бы организовал отдельно таблицу "cars", отдельно "parts", и третью связывающую таблицу, организующую связь "многих-ко-многим".
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37423353
BVB_berserk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда в первой таблице PK - CarID, во второй таблице PK - PartID, в третьей таблице PK - (CarID,PartID), чтобы исключить дублирование записей.
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37423670
Flying Dutchman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 24.08.2011 16:45, Sozonov wrote:

PK нужен в любой таблице.


Я бы сказал "почти в любой". Как редкое исключение, на ум приходит таблица для временного хранения (staging area) для данных с плохим качеством, которые потом "очищаются" и записываются в основную БД.
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37423811
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут 2 определяющих фактора для создания суррогатного PK:

- если есть ссылки на данную таблицу из других таблиц
- собираетесь ли в приложении редактировать записи из этой таблицы

если есть хоть один из факторов - необходим суррогатный PK
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37423950
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spтут 2 определяющих фактора для создания суррогатного PK:

- если есть ссылки на данную таблицу из других таблиц
- собираетесь ли в приложении редактировать записи из этой таблицы

если есть хоть один из факторов - необходим суррогатный PK
Оба утверждения очень спорны. Ссылки вполне себе могут проходить и по естественному ключу, если он небольшой, а редактирование записей вовсе не означает изменения ПК. По сути, единственное очень и очень существенное пожелание к ПК - это то, что он не должен меняться, иначе возникает изрядное количество заморочек.
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37424073
Goffman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iljyПо сути, единственное очень и очень существенное пожелание к ПК - это то, что он не должен меняться, иначе возникает изрядное количество заморочек.

Каких именно заморочек?
Просто я не раз сталкивался со сменой PK с естественного на суррогатный, особых проблем не припомню.
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37424079
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GoffmaniljyПо сути, единственное очень и очень существенное пожелание к ПК - это то, что он не должен меняться, иначе возникает изрядное количество заморочек.

Каких именно заморочек?
Просто я не раз сталкивался со сменой PK с естественного на суррогатный, особых проблем не припомню.
Я имею ввиду заморочки при работе с изменяющимся естественным ключем.
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37424114
Goffman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iljy,

ну так что за заморочки то?
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37424131
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Goffmaniljy,

ну так что за заморочки то?
Необходимость каскадных изменений зависимых таблиц при изменении ПК. Проблемы при изменении ПК пользователем. Проблемы в триггерах при сопоставлении inserted-deleted. Вот навскидку.
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37424421
Goffman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в триггерах доступно и новое и старое значение, да и в таких кросс-таблицах обычно триггеров не делают.
получается, что проблемы могут быть, только когда на эту таблицу кто-то ссылается?
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37424450
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iljyОба утверждения очень спорны. Ссылки вполне себе могут проходить и по естественному ключу, если он небольшой, а редактирование записей вовсе не означает изменения ПК. По сути, единственное очень и очень существенное пожелание к ПК - это то, что он не должен меняться, иначе возникает изрядное количество заморочек.

Конечно они могут быть спорны если все время изобретать велосипед, но данные факторы для создания PK выработаны из широкой практики. И понятное дело если вы мучаетесь с каждым объектом базы данных снова и снова - без фреймворков - то конечно можно при редактировании сущности и работать с составным ключом из 5 - 10 полей - никто этого не запретит! :))
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37424460
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Goffmanв триггерах доступно и новое и старое значение, да и в таких кросс-таблицах обычно триггеров не делают.
И что? Как вы узнаете, какая строка какой соответствует? И, во-первых, натуральные ПК бывают не только на кросс-таблицах, а во-вторых - триггеры часто используются даже на них для поддержания целостности.
Goffmanполучается, что проблемы могут быть, только когда на эту таблицу кто-то ссылается?
Проблемы возникают, когда вам нужно отследить изменения записи. Причем как раз проблемы со ссылками и пользовательскими изменениями решаются (ссылки автоматически изменяются движком сервера, а клиент вполне может сохранять старые значения ПК и обращаться к записи по ним), а вот с триггером - увы. Еще пример - журналирование изменений.
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37424464
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spiljyОба утверждения очень спорны. Ссылки вполне себе могут проходить и по естественному ключу, если он небольшой, а редактирование записей вовсе не означает изменения ПК. По сути, единственное очень и очень существенное пожелание к ПК - это то, что он не должен меняться, иначе возникает изрядное количество заморочек.

Конечно они могут быть спорны если все время изобретать велосипед, но данные факторы для создания PK выработаны из широкой практики. И понятное дело если вы мучаетесь с каждым объектом базы данных снова и снова - без фреймворков - то конечно можно при редактировании сущности и работать с составным ключом из 5 - 10 полей - никто этого не запретит! :))
Мучаются те, кто потом пытается оптимизировать базы, созданные теми самыми фреймворками. Вот, например, прелестная вещь - гуид, очень удобно - уникальность гарантирована (вроде бы), получать легче легкого даже на клиенте, самому ничего отслеживать не надо, напихал в каждую таблицу и радуешься. А всякие ДБА - идиоты, говорят про какую-то фрагментацию, раздувание индексов и прочую никому не нужную хрень.
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37424476
Goffman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iljyИ что? Как вы узнаете, какая строка какой соответствует?
Запросто, помогут :new или :old


iljyИ, во-первых, натуральные ПК бывают не только на кросс-таблицах,
Просто тема именно про кросс таблицы.

iljyа во-вторых - триггеры часто используются даже на них для поддержания целостности.
Насчет часто, это вы преувеличили, и опять же, какую проблему решит именно суррогатный PK в данном случае - не раскрыли.


iljyЕще пример - журналирование изменений.
частный случай ссылочной целостности.
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37424533
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GoffmaniljyИ что? Как вы узнаете, какая строка какой соответствует?
Запросто, помогут :new или :old
Несомненно, вот только они доступны только в триггерах FOR EACH ROW, а они есть далеко не во всех СУБД.
GoffmaniljyИ, во-первых, натуральные ПК бывают не только на кросс-таблицах,
Просто тема именно про кросс таблицы.
Вы меня спрашивали про возможные проблемы с естественным ПК. На данной конкретной теме с ним никаких проблем нет, о чем я уже давным-давно сказал .
Goffmaniljyа во-вторых - триггеры часто используются даже на них для поддержания целостности.
Насчет часто, это вы преувеличили, и опять же, какую проблему решит именно суррогатный PK в данном случае - не раскрыли.

Да ну? Знаете, что такое каскадное удаление и изменение? А знаете, что при наличии нескольких ВК могут вызникать множественные зависимости и прочее, и СУБД тупо не дает задать для них ON DELETE CASCADE, и приходится реализовывать эту функциональность триггерами? По поводу "какую проблему" смотрите выше.
GoffmaniljyЕще пример - журналирование изменений.
частный случай ссылочной целостности.
эээээ.... Какая связь между ведением журнала изменений, с указанием кто и когда изменил запись, и ссылочной целостностью?? А неизменяемый ПК здесь нужен именно для того, чтоб надежно отследить историю изменений конкретной записи, для чего ее нужно однозначно идентифицировать все время ее жизни.
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37424666
Goffman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iljyНесомненно, вот только они доступны только в триггерах FOR EACH ROW, а они есть далеко не во всех СУБД.
а вы имели в виду триггеры STATEMENT, так в них принципиально нельзя достучаться до конкретной записи, по крайней мере в Oracle.


iljy... Знаете, что такое каскадное удаление и изменение? А знаете, что при наличии нескольких ВК могут вызникать множественные зависимости и прочее...
Необходимость каскадных изменений и удалений, как я понимаю, может возникать только если на этот ключ есть ссылка из других таблиц, или еще есть варианты?

iljyэээээ.... Какая связь между ведением журнала изменений, с указанием кто и когда изменил запись, и ссылочной целостностью??
Потому что таблица журнала в этом варианте ссылается на таблицу с данными, надежнее всего это сделать с помощью внешнего ключа, или не так?
...
Рейтинг: 0 / 0
Нужен ли primary key в таблице, организующей связь один ко многим?
    #37424667
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iljyGoffmanпропущено...

Запросто, помогут :new или :old
Несомненно, вот только они доступны только в триггерах FOR EACH ROW, а они есть далеко не во всех СУБД.

FOR EACH ROW (с новыми и старыми значениями) весьма несложным образом "эмулируется" даже на весьма "древних" версиях MSSQL.
iljyGoffmanпропущено...
Насчет часто, это вы преувеличили, и опять же, какую проблему решит именно суррогатный PK в данном случае - не раскрыли.

Да ну? Знаете, что такое каскадное удаление и изменение? А знаете, что при наличии нескольких ВК могут вызникать множественные зависимости и прочее, и СУБД тупо не дает задать для них ON DELETE CASCADE, и приходится реализовывать эту функциональность триггерами? По поводу "какую проблему" смотрите выше.
При каскадных удалениях и обновлениях не должно возникать циклических зависимостей в операциях.
Соответственно, никакой разницы между естественными и суррогатными ключами в данном случае нет.
...
Рейтинг: 0 / 0
25 сообщений из 58, страница 1 из 3
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Нужен ли primary key в таблице, организующей связь один ко многим?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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