Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32963912&tid=1594597]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
80ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 399ms |

| 0 / 0 |
