|
|
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
Есть таблица, связывающая авто и запчасти, т.е. одному авто может соответствовать много запчастей: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Нужно ли в этой таблице поле id (primary key) ? Выборки происходят по полю car Апдейты по car и part ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2011, 15:45 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
Sozonov, нужен ли в таблице суррогатный ключ - знать никто кроме вас не может. Естественный ключ у вас тут напрашивается (car, part). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2011, 16:20 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
On 24.08.2011 16:45, Sozonov wrote: PK нужен в любой таблице. > Нужно ли в этой таблице поле id (primary key) ? Если на эту таблицу-связку не ссылаются другие таблицы, то отдельный суррогатный ключ в таких таблицах точно не нужен. Если на таблицу-связку есть ссылки, то можно подумать о том, чтобы его добавить, т.е. он может быть нужен, а может быть и нет. Зависит это от того, сколько таблиц ссылается на данную, чем больше, тем более он нужен (больше экономия). Но допустимы оба варианта дизайна. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2011, 16:34 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
MasterZiv PK нужен в любой таблице. Не правда. 2Sozonov Это твоя таблица test таблица связывающая машину и её части - так? Причем запчастей одних и тех же может быть куча, так как отсутствует поле count. Стало быть здесь всякие PK/AK никому не нужны. А вот про индексы подумать нужно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2011, 16:45 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
Светлый_Дайвер Не правда. 2Sozonov Это твоя таблица test таблица связывающая машину и её части - так? Причем запчастей одних и тех же может быть куча, так как отсутствует поле count. Стало быть здесь всякие PK/AK никому не нужны. А вот про индексы подумать нужно... Да, эта таблица связывает машины и запчасти. Каждой машине соответствует несколько запчастей (записи из таблицы parts), но у авто всегда одна запчасть каждого типа. Иначе говоря: у каждой машины по 11 запчастей, разный только уровень запчасти (поле level ) и некоторые запчасти имеют специфические параметры (поле params ) По индексам: Выборка из таблицы идет всегда по полю car , т.е. Код: plaintext По UPDATE `ам: они проходят по полям `car` и `part` : Код: plaintext В данный момент создан только индекс по полю car . Прочел недавно, что у индексов используется левая часть, т.е. индекс (`car`, `part`) будет использован при запросе Код: plaintext Если это так, то действительно лучше создать индекс (`car`, `part`), тогда он поможет также про update. Прав ли я? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2011, 17:03 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
Sozonov, да. Сделайте (car,part) первичным кластерным ключем и не мучьте животное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2011, 17:18 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
Sozonov, если собираешься ссылаться на эту таблицу, тогда да, иначе нет смысла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2011, 20:19 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
Нужно. Нехорошо, когда pk меняется (и вообще, когда несёт какую-то дополнительную нагрузку кроме идентификации записи) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2011, 00:00 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
Не применительно именно к данной задаче, но в общем случае, одна запчасть может подходить на несколько машин. Поэтому я бы организовал отдельно таблицу "cars", отдельно "parts", и третью связывающую таблицу, организующую связь "многих-ко-многим". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2011, 17:32 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
Тогда в первой таблице PK - CarID, во второй таблице PK - PartID, в третьей таблице PK - (CarID,PartID), чтобы исключить дублирование записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2011, 17:33 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 24.08.2011 16:45, Sozonov wrote: PK нужен в любой таблице. Я бы сказал "почти в любой". Как редкое исключение, на ум приходит таблица для временного хранения (staging area) для данных с плохим качеством, которые потом "очищаются" и записываются в основную БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2011, 00:38 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
тут 2 определяющих фактора для создания суррогатного PK: - если есть ссылки на данную таблицу из других таблиц - собираетесь ли в приложении редактировать записи из этой таблицы если есть хоть один из факторов - необходим суррогатный PK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2011, 13:12 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
spтут 2 определяющих фактора для создания суррогатного PK: - если есть ссылки на данную таблицу из других таблиц - собираетесь ли в приложении редактировать записи из этой таблицы если есть хоть один из факторов - необходим суррогатный PK Оба утверждения очень спорны. Ссылки вполне себе могут проходить и по естественному ключу, если он небольшой, а редактирование записей вовсе не означает изменения ПК. По сути, единственное очень и очень существенное пожелание к ПК - это то, что он не должен меняться, иначе возникает изрядное количество заморочек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2011, 16:47 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
iljyПо сути, единственное очень и очень существенное пожелание к ПК - это то, что он не должен меняться, иначе возникает изрядное количество заморочек. Каких именно заморочек? Просто я не раз сталкивался со сменой PK с естественного на суррогатный, особых проблем не припомню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2011, 19:51 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
GoffmaniljyПо сути, единственное очень и очень существенное пожелание к ПК - это то, что он не должен меняться, иначе возникает изрядное количество заморочек. Каких именно заморочек? Просто я не раз сталкивался со сменой PK с естественного на суррогатный, особых проблем не припомню. Я имею ввиду заморочки при работе с изменяющимся естественным ключем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2011, 20:05 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
iljy, ну так что за заморочки то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2011, 20:54 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
Goffmaniljy, ну так что за заморочки то? Необходимость каскадных изменений зависимых таблиц при изменении ПК. Проблемы при изменении ПК пользователем. Проблемы в триггерах при сопоставлении inserted-deleted. Вот навскидку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2011, 21:13 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
в триггерах доступно и новое и старое значение, да и в таких кросс-таблицах обычно триггеров не делают. получается, что проблемы могут быть, только когда на эту таблицу кто-то ссылается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2011, 10:38 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
iljyОба утверждения очень спорны. Ссылки вполне себе могут проходить и по естественному ключу, если он небольшой, а редактирование записей вовсе не означает изменения ПК. По сути, единственное очень и очень существенное пожелание к ПК - это то, что он не должен меняться, иначе возникает изрядное количество заморочек. Конечно они могут быть спорны если все время изобретать велосипед, но данные факторы для создания PK выработаны из широкой практики. И понятное дело если вы мучаетесь с каждым объектом базы данных снова и снова - без фреймворков - то конечно можно при редактировании сущности и работать с составным ключом из 5 - 10 полей - никто этого не запретит! :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2011, 12:06 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
Goffmanв триггерах доступно и новое и старое значение, да и в таких кросс-таблицах обычно триггеров не делают. И что? Как вы узнаете, какая строка какой соответствует? И, во-первых, натуральные ПК бывают не только на кросс-таблицах, а во-вторых - триггеры часто используются даже на них для поддержания целостности. Goffmanполучается, что проблемы могут быть, только когда на эту таблицу кто-то ссылается? Проблемы возникают, когда вам нужно отследить изменения записи. Причем как раз проблемы со ссылками и пользовательскими изменениями решаются (ссылки автоматически изменяются движком сервера, а клиент вполне может сохранять старые значения ПК и обращаться к записи по ним), а вот с триггером - увы. Еще пример - журналирование изменений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2011, 12:33 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
spiljyОба утверждения очень спорны. Ссылки вполне себе могут проходить и по естественному ключу, если он небольшой, а редактирование записей вовсе не означает изменения ПК. По сути, единственное очень и очень существенное пожелание к ПК - это то, что он не должен меняться, иначе возникает изрядное количество заморочек. Конечно они могут быть спорны если все время изобретать велосипед, но данные факторы для создания PK выработаны из широкой практики. И понятное дело если вы мучаетесь с каждым объектом базы данных снова и снова - без фреймворков - то конечно можно при редактировании сущности и работать с составным ключом из 5 - 10 полей - никто этого не запретит! :)) Мучаются те, кто потом пытается оптимизировать базы, созданные теми самыми фреймворками. Вот, например, прелестная вещь - гуид, очень удобно - уникальность гарантирована (вроде бы), получать легче легкого даже на клиенте, самому ничего отслеживать не надо, напихал в каждую таблицу и радуешься. А всякие ДБА - идиоты, говорят про какую-то фрагментацию, раздувание индексов и прочую никому не нужную хрень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2011, 12:45 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
iljyИ что? Как вы узнаете, какая строка какой соответствует? Запросто, помогут :new или :old iljyИ, во-первых, натуральные ПК бывают не только на кросс-таблицах, Просто тема именно про кросс таблицы. iljyа во-вторых - триггеры часто используются даже на них для поддержания целостности. Насчет часто, это вы преувеличили, и опять же, какую проблему решит именно суррогатный PK в данном случае - не раскрыли. iljyЕще пример - журналирование изменений. частный случай ссылочной целостности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2011, 13:19 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
GoffmaniljyИ что? Как вы узнаете, какая строка какой соответствует? Запросто, помогут :new или :old Несомненно, вот только они доступны только в триггерах FOR EACH ROW, а они есть далеко не во всех СУБД. GoffmaniljyИ, во-первых, натуральные ПК бывают не только на кросс-таблицах, Просто тема именно про кросс таблицы. Вы меня спрашивали про возможные проблемы с естественным ПК. На данной конкретной теме с ним никаких проблем нет, о чем я уже давным-давно сказал . Goffmaniljyа во-вторых - триггеры часто используются даже на них для поддержания целостности. Насчет часто, это вы преувеличили, и опять же, какую проблему решит именно суррогатный PK в данном случае - не раскрыли. Да ну? Знаете, что такое каскадное удаление и изменение? А знаете, что при наличии нескольких ВК могут вызникать множественные зависимости и прочее, и СУБД тупо не дает задать для них ON DELETE CASCADE, и приходится реализовывать эту функциональность триггерами? По поводу "какую проблему" смотрите выше. GoffmaniljyЕще пример - журналирование изменений. частный случай ссылочной целостности. эээээ.... Какая связь между ведением журнала изменений, с указанием кто и когда изменил запись, и ссылочной целостностью?? А неизменяемый ПК здесь нужен именно для того, чтоб надежно отследить историю изменений конкретной записи, для чего ее нужно однозначно идентифицировать все время ее жизни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2011, 15:43 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
iljyНесомненно, вот только они доступны только в триггерах FOR EACH ROW, а они есть далеко не во всех СУБД. а вы имели в виду триггеры STATEMENT, так в них принципиально нельзя достучаться до конкретной записи, по крайней мере в Oracle. iljy... Знаете, что такое каскадное удаление и изменение? А знаете, что при наличии нескольких ВК могут вызникать множественные зависимости и прочее... Необходимость каскадных изменений и удалений, как я понимаю, может возникать только если на этот ключ есть ссылка из других таблиц, или еще есть варианты? iljyэээээ.... Какая связь между ведением журнала изменений, с указанием кто и когда изменил запись, и ссылочной целостностью?? Потому что таблица журнала в этом варианте ссылается на таблицу с данными, надежнее всего это сделать с помощью внешнего ключа, или не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2011, 20:10 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
iljyGoffmanпропущено... Запросто, помогут :new или :old Несомненно, вот только они доступны только в триггерах FOR EACH ROW, а они есть далеко не во всех СУБД. FOR EACH ROW (с новыми и старыми значениями) весьма несложным образом "эмулируется" даже на весьма "древних" версиях MSSQL. iljyGoffmanпропущено... Насчет часто, это вы преувеличили, и опять же, какую проблему решит именно суррогатный PK в данном случае - не раскрыли. Да ну? Знаете, что такое каскадное удаление и изменение? А знаете, что при наличии нескольких ВК могут вызникать множественные зависимости и прочее, и СУБД тупо не дает задать для них ON DELETE CASCADE, и приходится реализовывать эту функциональность триггерами? По поводу "какую проблему" смотрите выше. При каскадных удалениях и обновлениях не должно возникать циклических зависимостей в операциях. Соответственно, никакой разницы между естественными и суррогатными ключами в данном случае нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2011, 20:12 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37424079&tid=1542038]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
401ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 286ms |
| total: | 770ms |

| 0 / 0 |
