Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
в таблице sell есть поле с уникальным индексом sellerk(код продавца). Например: есть продавец с кодом 123456. Если он физически был когда-то удален(точнее помечен на удаление, - но пользователь то думает что он удален), а потом в один прекрасный момент его пытаются опять создать с таким же кодом - то вылазит ошибка о нарушении уникальности. Оно конечно же понятно, что продавец хоть и был когда-то помечен на удаление но физически он в таблице остается. Как такой ситуации можно избежать... PS: PACK после удаления не хочется и неможится использовать - ведь режим роботы базы многопользовательский... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 14:36 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
А Recall-ом его нельзя? В смысле: set delete off locate for kod=123456 if found() recall endif set delete on ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 14:59 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
Использовать фильтрованны индекс как PK, но поскольку индекс с предложением FOR не используется в оптимизации, то так же надо иметь регулярный индекс без FOR условия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 14:59 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
1. Уникальный идентификатор записи - это то, что пользователь ни в коем случае не должен редактировать руками. Даже видеть его не должен! Это все идет на "откуп" внутренних функций генерации. В этом случае использование кодов ранее удаленных записей - в принципе недопустимо. 2. Пользователь может видеть (и редактировать) некое краткое обозначение (Nick Name). А в этом случае никто не мешает ввести повторяющееся значение. Контроль уникальности среди НЕ удаленных записей можно повесить на триггер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 16:16 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
ВладимирМ1. Уникальный идентификатор записи - это то, что пользователь ни в коем случае не должен редактировать руками. Даже видеть его не должен! Это все идет на "откуп" внутренних функций генерации. В этом случае использование кодов ранее удаленных записей - в принципе недопустимо. 2. Пользователь может видеть (и редактировать) некое краткое обозначение (Nick Name). А в этом случае никто не мешает ввести повторяющееся значение. Контроль уникальности среди НЕ удаленных записей можно повесить на триггер. Объясню для чего мне все это нужно: большую важность для меня имеет в базе данных связь один-ко-многим. В этом случае я могу настроить эту связь так, что при изменении кода продавца в главной таблице (все бывает - в бухгалтерии девченки код неправильно присвоили, а в конце месяца опомнились ) - он автоматически изменится во второстепенной таблице во всех записях. А чтобы эту связь создать - необходимо глючевое поле в главной таблице с уникальными даными. Вот поэтому их пользователь и вводит вручную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 16:51 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
авторбольшую важность для меня имеет в базе данных связь Вы перечитайте еще раз то, что сказал Максимов. Для связей между таблицами служат ключи - они скрыты от пользователей и никогда не показываются и не редактируются. Номер-же клиента - это данные, краткий идентификатор клиента, используемый для удобства. Вам же не приходит в голову организовать связь по наименованию клиента, так почему-же Вы делаете по номеру? Он не должен использоваться для связей. Можно контролировать какую-то уникальность номера, генерировать новый и т.д., а можно вообще позволить вводить хоть восклицательные знаки. Работа БД не должна никоим образом зависеть от номеров клиентов, договоров, накладных и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 17:04 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
help123Объясню для чего мне все это нужно: большую важность для меня имеет в базе данных связь один-ко-многим. В этом случае я могу настроить эту связь так, что при изменении кода продавца в главной таблице (все бывает - в бухгалтерии девченки код неправильно присвоили, а в конце месяца опомнились ) - он автоматически изменится во второстепенной таблице во всех записях. А чтобы эту связь создать - необходимо глючевое поле в главной таблице с уникальными даными. Вот поэтому их пользователь и вводит вручную. - Передаем сигналы точного времени "пи-пи-пи" - Для тех, кто не расслышал, передаем их еще раз "пи-пи-пи" Повторяю еще раз. Ну не должны пользователи сами вводить значения ключевых полей (суррогатного ключа). Просто не должны. Этим вы избежите огромного количества проблем в будущем. Например, описанная проблема просто не возникнет. Какая разница, что там девченки ввели в качестве NickName. На организацию связи это вообще никаким боком не влияет. Ведь связь идет по неким "внутренним" кодам, которые пользоваитли вообще не видят Ну, поменяют они потом у пользователя этот самый NickName. Ну и что? Это просто один из многих реквизитов, который никак, никоим образом не влияет на организацию связи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 17:10 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
Во-вторых, что значит удалять клиента? По нему хоть какие-то движения когда-то были? Наверняка - да, значит все - никаких удалений! История должна сохраняться, иначе что это за база данных? Нужно просто ОТКЛЮЧАТЬ неактуальные данные периодом их действия. Т.е. клиент должен иметь период действия - дату заведения и дату исключения. Пользователям показываются только те клиенты, которые подпадают под текущую дату работы системы (работать можно ведь и задним числом). Ну это все как должно быть :) А в Вашем случае, чтобы минимизировать переделки, можно перед удалением клиента очищать поле номера. Так сказать, освобождать номер клиента для его повторного использования, хоть и неправильно это. Еще можно хотя бы сохранять номер клиента в дополнительном поле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 17:20 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
XAndyчто значит удалять клиента? По нему хоть какие-то движения когда-то были? А в том то и дело что в связи один-ко-многим в базе данных есть Referential Integrity. И там то можно как раз и устанавливать условия удаления. А среди них есть и условие при котором если есть какие-то движения по клиенту - то будет запрет на удаление. Я так понял что оно автоматически свой тригер пишет... XAndyчтобы минимизировать переделки, можно перед удалением клиента очищать поле номера а вот эта идея мне понравилась... спасибо.. попробуем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 17:41 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
Hi XAndy! > А в Вашем случае, чтобы минимизировать переделки, можно перед удалением клиента очищать поле номера. Это не поможет... Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 00:22 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
Igor KorolyovЭто не поможет... А почему не поможет? Можно ведь и не затирать в прямом смысле - а просто заменить на специально сгенерированную уникальную строку. powered by Visual FoxPro 8.0 SP1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 09:17 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
help123 Igor KorolyovЭто не поможет... А почему не поможет? Можно ведь и не затирать в прямом смысле - а просто заменить на специально сгенерированную уникальную строку. Слушай, а самому чуть-чуть подумать? Твоя проблема возникла от того, что записи физически не удаляются, а лишь помечаются как удаленные. Теперь представь, что ты перед удалением очищаешь это поле. Один раз - замечательно. А второй - получишь сообщение об ошибке, что такое поле уже есть. То самое - очищенное, что было удалено ранее. Пустое значение - это тоже значение! А значение NULL для Primary-индексов - недопустимо! Так что, по сути, у тебя только 2 принципиальных решения: либо не давать пользователям править ключевое поле либо в случае возникновения подобного конфликта попросить выполнить очистку базы данных от записей ранее помеченных как удаленные Большая просьба. Прежде чем начать говорить, что это невозможно, да это требует эксклюзивного доступа и т.д. и т.п. Ответьте себе на несколько вопросовю Насколько часто возникает подобная ситуация? Стоит ли писать очень сложный код для решения этой проблемы, если ситуация крайне редкая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 10:00 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
Кстати, это только в совсем нормализированных таблицах комбинация полей в записи зависит от первичного ключа и только от него. А на практике бывают еще и кандидатные индексы. Я, например, сторонник такого подхода: PK - суррогатный. Кандидатный ключ - как правило, один на таблицу, но даже если и больше - строится с условием FOR NOT DELETED(). Прошу покритиковать ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 10:54 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
Добавление к предыдущему посту: в случае, если PK в таблице суррогатный, наличие кандидатного ключа становится просто-таки обязательным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 10:56 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
UrriКстати, это только в совсем нормализированных таблицах комбинация полей в записи зависит от первичного ключа и только от него. А на практике бывают еще и кандидатные индексы. Я, например, сторонник такого подхода: PK - суррогатный. Кандидатный ключ - как правило, один на таблицу, но даже если и больше - строится с условием FOR NOT DELETED(). Прошу покритиковать ;-) Почитай здесь Раздел "Ключевые поля" http://www.foxclub.ru/kb/index.php?sid=24056&aktion=artikel&rubrik=001&id=6&lang=ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 11:03 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
Владимир, у тебя в статье как раз вопрос о кандидатных ключах не освещен (я не увидел). А ведь, по сути дела, использование кандидатных ключей - это отличный (а порой и необходимый) способ добавить целостности в БД. Вот например, твой пример с реализацией отношения "многие ко многим" через третью таблицу. Если в ней используем суррогатный PK, то связи с первой и второй таблицами получаются неидентифицирующими, и тогда - по обстоятельствам - надо назначать кандидатным ключом или пару ID первых двух таблиц (если конкретная запись первой должна быть связана с конкретной записью второй не более одного раза), либо эту пару и дополнительный(е) атрибут(ы). Но, в случае удаления записи с такой комбинацией кандидатных атрибутов, нужно предусмотреть возможность повторной вставки новой записи с той же комбинацией кандидатных атрибутов - отсюда появляется условие FOR в кандидатном индексе. А критику я хотел бы услышать по всем направлениям, в том числе, нет ли у кого адекватного варианта получше, в плане производительности, например, простоты реализации и т.п. Есть ли ситуации, которые этот подход плохо отрабатывает. Ну и т.д. ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 14:18 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
Urri Мне кажется, что в статье теоретическое описания вполне достаточно. Urriпо обстоятельствам - надо назначать кандидатным ключом или пару ID первых двух таблиц (если конкретная запись первой должна быть связана с конкретной записью второй не более одного раза Что касается Вашего примера, один-ко-дному через третью таблицу и возможность использования СК на промежуточную таблицу, то это надо рассматривать как ограничение конкретной реализации, ведь промежуточная таблица м. связывать докумнты друг с другом используя разные правила, причем взаимоисключающие друг друга. Urriнужно предусмотреть возможность повторной вставки новой записи с той же комбинацией кандидатных атрибутов - отсюда появляется условие FOR в кандидатном индексе По поводу удаления - "сурогатный ключ" является уникальным для данной таблицы (если исходить из такого предположения), таким образом удалив связанные документы и пересоздав их , у вновь созданных будут уже другие "сурогатные" ключи и т.о. повторение их в промежуточной таблице невозможно. По поводу критики на использование фильтрованных индексов - их использование характерно для "естественных" ключей или если не использовать SET DELETE ON , а вводить свои признаки удаления записи, такой подход я сам использую, поэтому PK&CK у меня имеют FOR условие. А кол-во СК особой роли не играет, если по условиям задачи их м.б. 10 значит 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 14:47 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
UrriВладимир, у тебя в статье как раз вопрос о кандидатных ключах не освещен (я не увидел). А ведь, по сути дела, использование кандидатных ключей - это отличный (а порой и необходимый) способ добавить целостности в БД. У Вас какая-то путанная терминология получается. Цель ключевого поля (PK - Primary Key) - однозначная идентификация записи. Все! При этом в пределах ВСЕЙ таблицы значение PK для каждой записи уникально. Цель внешнего ключа (FK - Foreign Key) - это хранение значения PK. Все! При этом в пределах ВСЕЙ таблицы значение FK - НЕ уникально. Что Вы подразумеваете под "кандитаным ключем" - непонятно. UrriВот например, твой пример с реализацией отношения "многие ко многим" через третью таблицу. Если в ней используем суррогатный PK, то связи с первой и второй таблицами получаются неидентифицирующими, и тогда - по обстоятельствам - надо назначать кандидатным ключом или пару ID первых двух таблиц (если конкретная запись первой должна быть связана с конкретной записью второй не более одного раза), либо эту пару и дополнительный(е) атрибут(ы). Опять у Вас какая-то "каша" получается. Разве я писал, что надо отказаться от FK при такой связи? Я там написал, что кроме 2 существующих FK надо добавить еще одно поле PK. Я настаиваю на том, что в такой ситуации использование пары FK, как заменитель PK - заведомо порочная практика! Т.е. в подобной ситуации связь организуется по классической схеме от PK главной таблицы к FK таблицы-посредника и от второго FK таблицы-посредника к PK подчиненной таблицы. А вот PK таблицы-посредника выполняет совсем другую функцию. К организации связи он вообще не имеет никакого отношения. Его цель - однозначная идентификация записи. ВСЕ! UrriА критику я хотел бы услышать по всем направлениям, в том числе, нет ли у кого адекватного варианта получше, в плане производительности, например, простоты реализации и т.п. Есть ли ситуации, которые этот подход плохо отрабатывает. Ну и т.д. ;-) Конечно есть! У меня, например Индекс с FOR-условием не участвует в оптимизации. Т.е. скорость выполнения запросов падает. Для ускорения нужен еще один простой индекс, но уже без FOR-условия. Альтернатива - это триггер. Который проверяет в момент записи факт существования дублирующей записи среди НЕ удаленных записей. Поскольку рассматриваемое поле не является PK, то наличие в нем дублей в принципе допустимо. Нужно отсечь только дубли среди НЕ удаленных записей. С чем вполне может справиться триггер. Причем я написал "универсальный" (в пределах моей задачи) триггер. Т.е. один общий код для любых таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 14:47 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
ВладимирМ ВладимирМ Цель внешнего ключа (FK - Foreign Key) - это хранение значения PK. Все! Вот здесь, ещё бы добавил - и обеспечение ссылочной целостности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 14:56 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
PaulWist ВладимирМ ВладимирМ Цель внешнего ключа (FK - Foreign Key) - это хранение значения PK. Все! Вот здесь, ещё бы добавил - и обеспечение ссылочной целостности. Нет. Обеспечение ссылочной целостности - это отдельный процесс ! FK - это элемент этого процесса. Но он никак, никоим образом, не может обеспечить ссылочную целостность. Ведь в организации ссылочной целостности участвует и PK, но тебе и в голову не приходит добавлять, что цель PK - это обеспечение ссылочной целостности! Вообще-то, чем меньше использовать разной "терминологии" (пусть и официально признанной), а просто рассказывать что и для чего делаешь, то, как правило, и сам понимаешь в чем ошибся и тебя быстрее понимают и поправляют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 15:08 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
ВладимирМ ВладимирМОбеспечение ссылочной целостности - это отдельный процесс! FK - это элемент этого процесса. Развивая мысль, PK это ведь тоже отдельный процесс, причем ВладимирМЦель ключевого поля (PK - Primary Key) - однозначная идентификация записи так вот эта однозначная идентификация ключевого поля, просто использует тот или иной механизм для обеспечения цели, точно так же FK использует свой механизм для обеспечения своей цели, а не просто хранить PK (вроде как получается может хранить РК, а может хранить ещё что_нибудь), поэтому FK как и PK это необходимая часть ссылочной целостности, и говорить о них в отрыве друг от друга, значит использовать просто поля в двух разных таблицах. ВладимирМВедь в организации ссылочной целостности участвует и PK, но тебе и в голову не приходит добавлять, что цель PK - это обеспечение ссылочной целостности! В общем случае нет не приходит, а в частном случае (RI) должно приходить или у тебя есть возражения. авторВообще-то, чем меньше использовать разной "терминологии" (пусть и официально признанной), а просто рассказывать что и для чего делаешь, то, как правило, и сам понимаешь в чем ошибся и тебя быстрее понимают и поправляют. Поэтому мы здесь и общаемся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 15:37 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
PaulWist В принципе, есть к чему придраться Однако так можно продолжать до бесконечности. Мы друг друга поняли, а уточнение формулировок - это уже детали... В данном случае меня поразила терминология Urri и очень своеобразные выводы исходя из его собственной терминологии и некой абстрактной задачи. Вот я и попытался перевести дискуссию в рамки некой конкретики, чтобы уточнить, что же именно он хотел сказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 15:51 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Согласен. Честно сказать я тоже не понял приведенный пример, как иллюстрацию необходимости использования FOR индексов, видимо структура данных или её развитие было построено таким образом, что бы "малой кровью" через СК быстро решить проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 15:58 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
ОК, для объяснения своей путаной терминологии приведу пару примеров. Простейший справочник чего-то. Атрибутов всего 2: Наименование и значение. Код: plaintext 1. 2. 3. 4. 5. 6. В моей терминологии поле Name является кандидатным ключом таблицы DataDir, потому что значения этого поля должны быть точно так же уникальны, как и значения суррогатного ключа DataDirID. Потому что именно поле Name пользователи видят через интерфейс и именно это поле отражает для них сущность элемента справочника. И двух одинаковых Name быть не должно. Представим, что мы реализуем стратегию "пользователь должен иметь право на ошибку всегда, если это возможно". Допустим также, что элементы справочника можно удалять и добавлять по-новой. Тогда пользователь имеет возможность удалить элемент, понять, что ошибся и добавить то же имя. Естественно, с новым DataDirID. Строим индексы (с учетом поправки Владимира М): Код: plaintext 1. 2. 3. Все. Как резонно заметил PaulWist, подход используется как разновидность ограничения реализации - с целью иметь в таблице именно то, что хотели аналитики БД, а не то, что смогли навводить пользователи. ВладимирМОпять у Вас какая-то "каша" получается. Разве я писал, что надо отказаться от FK при такой связи? Я там написал, что кроме 2 существующих FK надо добавить еще одно поле PK. Я настаиваю на том, что в такой ситуации использование пары FK, как заменитель PK - заведомо порочная практика! Т.е. в подобной ситуации связь организуется по классической схеме от PK главной таблицы к FK таблицы-посредника и от второго FK таблицы-посредника к PK подчиненной таблицы. А вот PK таблицы-посредника выполняет совсем другую функцию. К организации связи он вообще не имеет никакого отношения. Его цель - однозначная идентификация записи. ВСЕ! Как раз со всем этим, и со всем остальным я не спорю. А просто предлагаю вводить в модель дополнительное ограничение по вводу информации через кандидатный ключ. Это актуально практически для всех таблиц. И в связующую - тоже. Пример2: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 16:00 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#18+
По первому пример понятно. Обсуждалась такая проблема. Я ее реализовал через триггер. Т.е. вместо 2 индексов для каждой таблицы я сделал по одному индексу для каждой таблицы и один общий триггер на все таблицы. По второму примеру опять ничего не понял. Какое отношение имеет PK в таблице-посреднике к организации связи? Он там вводится совсем не для этого! Вы делаете ничем не обоснованное допущение, что пара FK должны быть уникальны в пределах таблицы-посредника. Почему собственно? По ссылке я привел пример: один клиент имеет несколько счетов в одном и том же банке. Т.е. в таблице-посреднике несколько одинаковых пар FK плюс дополнительное поле со счетом. Вы хотите создать индекс включающий ВСЕ поля таблицы-посредника? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2005, 16:25 |
|
||
|
удаление...вставка...вопрос об уникальности индекса...
|
|||
|---|---|---|---|
|
#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?all=1&fid=41&tid=1594597]: |
0ms |
get settings: |
8ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
71ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 401ms |

| 0 / 0 |
