Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
Urri Urri Допустим также, что элементы справочника можно удалять и добавлять по-новой. На мой взгляд вот здесь логическая ошибка, если ссылка на справочник попала в дочернюю таблицу, то при модификации самого справочника ограничение RI должно модифицировать (запретить) все записи в дочерней таблице, какой бы ключ не использовался PK/CK. Пошли дальше, кандидат ключ Name не используется в таблице3, поэтому его ограничение может быть организовано как хочется. Ограничение кандидата на таблицу3 в данном конкретном случае показывает, что таблица3 не нужна, поскольку этого же можно добиться связывая таб1 и таб2 и накладывая ограничение на их поля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 16:27 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
ВладимирМПо первому пример понятно. Обсуждалась такая проблема. Я ее реализовал через триггер. Т.е. вместо 2 индексов для каждой таблицы я сделал по одному индексу для каждой таблицы и один общий триггер на все таблицы. Интересно понять, как он работает, этот триггер (если Вы его описывали, то я пропустил). ВладимирМПо второму примеру опять ничего не понял. Какое отношение имеет PK в таблице-посреднике к организации связи? Он там вводится совсем не для этого! Вы делаете ничем не обоснованное допущение, что пара FK должны быть уникальны в пределах таблицы-посредника. Почему собственно? По ссылке я привел пример: один клиент имеет несколько счетов в одном и том же банке. Т.е. в таблице-посреднике несколько одинаковых пар FK плюс дополнительное поле со счетом. Вы хотите создать индекс включающий ВСЕ поля таблицы-посредника? Если таблица может иметь несколько одинаковых пар FK, значит, должен существовать еще по крайней мере один атрибут, с которым комбинация становится уникальной, и он(они) также должен быть добавлен в кандидатный ключ. Полностью одинаковых строк в таблице быть не должно - это нарушение одной из первых нормальных форм (никогда не мог запомнить, какой именно ;-)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 16:35 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
PS: суррогатный ключ не в счет - он ведь только суррогатный ;-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 16:36 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
PaulWist Urri Допустим также, что элементы справочника можно удалять и добавлять по-новой. На мой взгляд вот здесь логическая ошибка, если ссылка на справочник попала в дочернюю таблицу, то при модификации самого справочника ограничение RI должно модифицировать (запретить) все записи в дочерней таблице, какой бы ключ не использовался PK/CK. А он еще не попал в дочернюю таблицу. ;-) (А если успел попасть, тут, конечно, должна вступить в действие проверка RI). PaulWistПошли дальше, кандидат ключ Name не используется в таблице3, поэтому его ограничение может быть организовано как хочется.Второй пример с первым никак не связан. PaulWistОграничение кандидата на таблицу3 в данном конкретном случае показывает, что таблица3 не нужна, поскольку этого же можно добиться связывая таб1 и таб2 и накладывая ограничение на их поля.А тут Вы неправы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 16:39 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
Urri А он еще не попал в дочернюю таблицу. а мы эту запись удалили, поскольку в дочернюю таблицу д. попасть ID справочника, то ввод нового (в смысле удаленной записи) получит свой новый ID и никак не повлияет на ограничение PK. Urri А тут Вы неправы. ну значит я не понял о чем идет речь. Приведите тестовый пример. Мне это видиться так Table1 T1.ID + T1.ID_T2 => candidat Table2 T2.ID + T2.ID_T1 => candidat ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 16:56 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
PaulWist а мы эту запись удалили, поскольку в дочернюю таблицу д. попасть ID справочника, то ввод нового (в смысле удаленной записи) получит свой новый ID и никак не повлияет на ограничение PK. Но поскольку без условия FOR NOT DELETED() кандидатный ключ добавить новую запись не позволит (таблицу после каждого удаления мы не пакуем), придется делать лишний индекс ;-) Вернее, :( Мне это видиться так Table1 T1.ID + T1.ID_T2 => candidat Table2 T2.ID + T2.ID_T1 => candidat Table3: Table3IDTable1IDTable2IDComment111Здесь...212пока...321все ОК411А вот и дубль - которого быть не должно Запись с Table1ID = 1, Table2ID = 1 уже была. А никаких дополнительных атрибутов в нашем примере нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 17:13 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
Urri ВладимирМПо первому пример понятно. Обсуждалась такая проблема. Я ее реализовал через триггер. Т.е. вместо 2 индексов для каждой таблицы я сделал по одному индексу для каждой таблицы и один общий триггер на все таблицы. Интересно понять, как он работает, этот триггер (если Вы его описывали, то я пропустил). Да также, как и индекс Candidat. Выполняет Select-SQL (или LOCATE FOR) на премет поиска записи с текущими начениями контролируемого выражения, исключая текущую запись. Поскольку по искомому выражению есть индекс, то это обеспечивает выполнение следующих условий: -) Высокая скорость поиска -) Невозможность других пользователей внести дубль, пока выполняется проверка (проверка идет внутри транзакции). Блокируется индекс. UrriЕсли таблица может иметь несколько одинаковых пар FK, значит, должен существовать еще по крайней мере один атрибут, с которым комбинация становится уникальной, и он(они) также должен быть добавлен в кандидатный ключ. Полностью одинаковых строк в таблице быть не должно - это нарушение одной из первых нормальных форм (никогда не мог запомнить, какой именно ;-)). Ну, Вы, блин, даете! (с) Повторяю еще раз: Вы хотите создать индекс включающий ВСЕ поля таблицы-посредника? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 17:44 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
ВладимирМ UrriЕсли таблица может иметь несколько одинаковых пар FK, значит, должен существовать еще по крайней мере один атрибут, с которым комбинация становится уникальной, и он(они) также должен быть добавлен в кандидатный ключ. Полностью одинаковых строк в таблице быть не должно - это нарушение одной из первых нормальных форм (никогда не мог запомнить, какой именно ;-)). Ну, Вы, блин, даете! (с) Повторяю еще раз: Вы хотите создать индекс включающий ВСЕ поля таблицы-посредника? Нет, только для комбинации, обеспечивающей уникальность строки. Да, если в таблице уникальность строки обеспечивается только полной совокупностью атрибутов (кроме суррогатного PK, конечно). За разъяснения по поводу триггера - спасибо. С относительным минусом моего подхода все ясно: "лишний" индекс со всеми вытекающими. С относительным плюсом - тоже: не требуется создавать другие объекты (например, триггеры). Попробую сравнить производительность наших подходов на досуге. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 18:03 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
UrriС относительным минусом моего подхода все ясно: "лишний" индекс со всеми вытекающими Никакой он не лишний :) И наиболее правильный ответ на поставленный в топике вопрос. Естественный реквизит (или группа реквизитов) - "продавец с кодом", претендующий на уникальность потому и называется candidate, потому что претендует на ПК, но никогда им не будет :) - мы же правильные - и заведём суррогатный ключ для этой цели, а его (или группу) - сделаем кандидатом и конечно FOR NOT DELETED. То есть всегда, когда есть визуальный конкурент у скрытого ПК, надо делать два индекса. То же самое в отношении группы внешних ключей, если необходимо обеспечить уникальность. BINTOC(fk1_id)+BINTOC(fk2_id) - кандидат и FOR NOT DELETED. Штатный подход. При чём тут какие-то триггеры? Тормозов никаких нет и быть не может. Всё реально работает и летает на базе 184 табл./~1 гиг/161 пользователь (на сегодняшний день). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 18:43 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
Hi help123! > А почему не поможет? Можно ведь и не затирать в прямом смысле - а просто заменить на специально сгенерированную уникальную строку. Так работать будет, но ведь изначально это не было написано :) И что самое важное - это (возможность так сделать) НЕ предлог для отказа от идей суррогатного ключа - для которого никаких подобных извращений просто НЕ ТРЕБУЕТСЯ. Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2005, 23:33 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
Hi Urri! Расслабься, всё у тебя нормально и правильно - просто Многоуважаемые коллеги тебя очевидно не совсем правильно понимают (или не хотят понять :) )... Да, для асоциативных таблиц твоя схема (что первая что вторая) вполне правильна - просто в первой (БЕЗ суррогатного ключа) потребуется на PK фильтр накладывать, и что ещё более неприятно - использовать "составной" PK - это конечно не смертельно, и если ассоциативная сущность НИКОГДА не обрастёт доп. атрибутами, не потребует привязки к себе новых сущностей и т.п. - то вполне можно наплевать на сложность - тем самым сэкономив одно поле... Но обычно вылазят всякие "левые" задачи, и становится необходимо ссылаться на элемент ассоциативной таблицы (да банально - лог "какой нехороший юзер создал эту связь", или чуть сложнее - задачи репликации) - тогда вариант с "выделенным" простым PK (суррогатным) явно выигрывает. Кроме того если ВСЕ таблицы имеют суррогатный PK это упрощает многое - в частности классы по работе с данными - всегда ясно что запись идентифицирует именно один простой Integer, а не "тут C(10) - там N(14) а ещё где-то D+N(10)+C(32)". Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2005, 23:34 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
Urri Urri Запись с Table1ID = 1, Table2ID = 1 уже была. А никаких дополнительных атрибутов в нашем примере нет. Да, это действительно правильно, просто я не понял, что Ваш первый пример никак не связан со вторым примером, а приведенная схема и у меня используется. Вообщем, Igor Korolyov подвел итог дискуссии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 08:30 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32969025&tid=1594597]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 260ms |
| total: | 416ms |

| 0 / 0 |
