![]() |
Модераторы: LSD |
![]() ![]() ![]() |
|
Scarlett |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 14.12.2006 Репутация: нет Всего: 1 |
необходим срочный ответ!
![]() при создании структуры БД возник небольшой спор по такой ситуации: например, есть 2 таблицы, у каждой из которых есть первичный ключ эти таблицы связаны между собой как многие-ко-многим поэтому создается между ними промежуточная таблица, которая хранит в себе первичные ключи этих таблиц, т.е. они для нее являются foreign key для промежуточной таблицы эти два форейн ки уже определяют ее первичный ключ или все-таки для этой таблицы надо тоже выделять отдельный первичный ключ? я считаю, что так как таблица является связующей, то у нее 2 колонки, которые хранят форейн ки и вместе определяют первичный ключ мне же говорят что надо создавать еще одну колонку, которая будет хранить первичный ключ, т.е. будет 3 колонки тогда получается, что на 2 колонки надо еще один констрейнт вот и вопрос: определять новый первичный ключ или нет? В промежуточной таблице никакая другая информация не хранится! Это сообщение отредактировал(а) Scarlett - 21.12.2007, 19:44 |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 5 Всего: 260 |
скорее всего, говорящий человек ошибается в понятиях: путает теплое и мягкое. первичный ключ - то, что однозначно идентифицирует запись. зачастую, в таблице, хранящей связь многие-ко-многим сочетание значений полей-ссылок на другие таблицы уже уникально. потому это сочетание и может быть первичным ключом(в модели - точно будет, для использования СУБД тоже можно указать - будет составной естественный первичный ключ). Можно добавить дополнительно автоинкрементное поле, которое объявить первичным ключом таблицы. Это будет простой синтетический(искусственный) первичный ключ. Слегка подытожу: есть составной(из нескольких полей) и простой(из одного поля) первичный ключ, а есть естественный(уникальность определяется логикой модели, точно так же, как ДНК абсолютно уникально безо всяких паспортных номеров - даже у клонов за счет мутации генотип будет отличен) и искусственный(автоинкрементное поле) первичный ключ. Так вот: в настоящий момент(если сочетание значений в каждой записи таблицы уникально) у тебя - составной естественный первичный ключ. А тебе предлагают просто синтетический первичный ключ. ---- Совет: если у тебя связь(которая имеет форму "многая-ко-многим") может иметь дополнительные аттрибуты и связи(т.е. на связь между сущностями ссылаются другие связи), то лучше ввести в третью твою таблицу синтетический простой первичный ключ, что не усложнять запросы объединениями таблиц по двум-трем полям. Если связь аттрибутов/зависимостей не может имет в пределах модели, вполне можно обойтись только имеющимимся полями - не стОит без нужды плодить не используемые данные. |
|||
|
||||
Deniz |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 7 Всего: 44 |
В основном поддерживаю skyboy, про искусственный и естественный все правильно, но споры эти идут давно, и у всех есть свои мнения на этот счет. От себя добавлю, что система должна иметь возможность масштабирования, и здесь
Накладные расходы: дополнительное поле первичный ключ + уникальный индекс по паре внешних ключей. Как видно накладные расходы небольшие, но зато если потребуется ввести новую функциональность для этой связи (например добавить временные интервалы), затраты будут гораздо меньше. В общем я за искусственный ключ в любом случае, IMHO. PS: на www.ibase.ru есть статья очень старая, но кое-что можно для себя извлечь. -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
Scarlett |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 14.12.2006 Репутация: нет Всего: 1 |
спасибо за полный ответ
![]() в действительности, я не предполагаю хранить что-либо в промежуточной таблице поэтому и не хотелось создавать синтетический ( ![]() хотя я не знаю, что вдруг взбредет в голову заказчикам, поэтому, наверное, все-таки прийдется его создавать... ![]() |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 5 Всего: 260 |
если вопрос решен, помечаем его решенным(кликаем по надписи "пометить вопрос решенным" справа вверху над первым сообщением в теме).
|
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 24 Всего: 538 |
Я считаю что такой ключ не нужен, т.к. это ухудшает производительность, а плюсов не дает. Синтетический ПК создавался для того, чтобы абстрагироваться от пользовательских данных. Например если у нас ПК образуется по полям ФИО, то изменение ФИО (например опечатались при вводе) потребует изменения всех записей ссылающихся на данную. А синтетический ПК не как не связан с пользовательскими данными, и не должен никогда изменяться. В данном случае ПК тоже не будет никак связан с пользовательскими данными, и проблем ЕК в нем нет. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
Deniz |
|
||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 7 Всего: 44 |
Вот ключевая фраза: Представим, что потребовалось хранить период жизни записи-связи. Например, было:
-------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
||||||
|
|||||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 24 Всего: 538 |
При таком раскладе конечно - да... Но: 1. Это экзотика, такие вещи приходится делать редко. 2. Перестроение базы операция не рядовая и выполняется тоже крайне редко. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 13 Всего: 454 |
Сплошь и рядом. Вопрос, как обычно, решается просто - является ли совокупность ссылок на сущности отдельной сущностью, или она только устанавливает связи? Если она является самостоятельной сущностью, она должна иметь первичный ключ. Если нет - достаточно синтетического ключа. Скажем, если таблицу поставщиков и таблицу потребителей по схеме много-ко-многим связывает таблица договоров или рейсов - непременно первичный ключ... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 24 Всего: 538 |
Тогда это уже отдельная сущность, связанная с двумя другими. А тут речь шла о том, что есть связь между двумя сущностями. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 5 Всего: 260 |
не совсем. есть же понятие в ER-диаграммах "relationship-entity"("связующая сущность" в моем переводе) для сущности, не имеющей воплощения в реальном мире, но имеющей в пределах модели дополнительные атрибуты/связи. но это уже вопрос терминологии. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 13 Всего: 454 |
Так а я о чем! и неважно, есть у нее физический смысл или нет (см. пост skyboy). Ну привел я пример с физическим смыслом... хотите без него? пожалуйста, навскидку - номера телефонов фирмы и список сотрудников. И связующая таблица - по каким телефонам до каких сотрудников можно дозвониться. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Scarlett |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 14.12.2006 Репутация: нет Всего: 1 |
я потому и решила пойти на уступки и создать первичный ключ
так как ситуация с примером, который привел Deniz, может случиться, а может и не быть таким образом вопрос закрылся ![]() |
|||
|
||||
Deniz |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 7 Всего: 44 |
Не хотелось добавлять после
но... Scarlett, не описав проблему и предметную область полностью (что это за связь) Вы и получили такие ответы.
Не знаю как у Вас, но это происходит достаточно часто. PS: как правило такие связи характеризуются не только периодом жизни(который всегда должен быть для истории), но еще дополнительными атрибутами. И если на первый взгляд их не видно, то потом, когда заказчик захочет, будет, как говорил классик,
Это сообщение отредактировал(а) Deniz - 25.12.2007, 10:00 -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
||||
|
|||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 24 Всего: 538 |
Я про связь с реальным миром и не говорил. Я говорю про, что - это или отдельная сущность (пусть и связующая) или связь в чистом виде. Для связей в чистом виде собственный СК не нужен. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Общие вопросы по базам данных" | |
|
Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:
Данный форум не предназначен для:
Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение.
Полезные советы: Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | СУБД, общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |