powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / удаление...вставка...вопрос об уникальности индекса...
37 сообщений из 37, показаны все 2 страниц
удаление...вставка...вопрос об уникальности индекса...
    #32963505
Фотография help123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в таблице sell есть поле с уникальным индексом sellerk(код продавца).
Например: есть продавец с кодом 123456. Если он физически был когда-то удален(точнее помечен на удаление, - но пользователь то думает что он удален), а потом в один прекрасный момент его пытаются опять создать с таким же кодом - то вылазит ошибка о нарушении уникальности.
Оно конечно же понятно, что продавец хоть и был когда-то помечен на удаление но физически он в таблице остается.
Как такой ситуации можно избежать...
PS: PACK после удаления не хочется и неможится использовать - ведь режим роботы базы многопользовательский...
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32963591
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А Recall-ом его нельзя?
В смысле:

set delete off
locate for kod=123456
if found()
recall
endif
set delete on
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32963592
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать фильтрованны индекс как PK, но поскольку индекс с предложением FOR не используется в оптимизации, то так же надо иметь регулярный индекс без FOR условия.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32963912
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Уникальный идентификатор записи - это то, что пользователь ни в коем случае не должен редактировать руками. Даже видеть его не должен! Это все идет на "откуп" внутренних функций генерации. В этом случае использование кодов ранее удаленных записей - в принципе недопустимо.

2. Пользователь может видеть (и редактировать) некое краткое обозначение (Nick Name). А в этом случае никто не мешает ввести повторяющееся значение. Контроль уникальности среди НЕ удаленных записей можно повесить на триггер.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32964041
Фотография help123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ1. Уникальный идентификатор записи - это то, что пользователь ни в коем случае не должен редактировать руками. Даже видеть его не должен! Это все идет на "откуп" внутренних функций генерации. В этом случае использование кодов ранее удаленных записей - в принципе недопустимо.

2. Пользователь может видеть (и редактировать) некое краткое обозначение (Nick Name). А в этом случае никто не мешает ввести повторяющееся значение. Контроль уникальности среди НЕ удаленных записей можно повесить на триггер. Объясню для чего мне все это нужно:
большую важность для меня имеет в базе данных связь один-ко-многим. В этом случае я могу настроить эту связь так, что при изменении кода продавца в главной таблице (все бывает - в бухгалтерии девченки код неправильно присвоили, а в конце месяца опомнились ) - он автоматически изменится во второстепенной таблице во всех записях. А чтобы эту связь создать - необходимо глючевое поле в главной таблице с уникальными даными. Вот поэтому их пользователь и вводит вручную.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32964085
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторбольшую важность для меня имеет в базе данных связь
Вы перечитайте еще раз то, что сказал Максимов. Для связей между таблицами служат ключи - они скрыты от пользователей и никогда не показываются и не редактируются. Номер-же клиента - это данные, краткий идентификатор клиента, используемый для удобства. Вам же не приходит в голову организовать связь по наименованию клиента, так почему-же Вы делаете по номеру? Он не должен использоваться для связей. Можно контролировать какую-то уникальность номера, генерировать новый и т.д., а можно вообще позволить вводить хоть восклицательные знаки. Работа БД не должна никоим образом зависеть от номеров клиентов, договоров, накладных и т.п.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32964100
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
help123Объясню для чего мне все это нужно:
большую важность для меня имеет в базе данных связь один-ко-многим. В этом случае я могу настроить эту связь так, что при изменении кода продавца в главной таблице (все бывает - в бухгалтерии девченки код неправильно присвоили, а в конце месяца опомнились ) - он автоматически изменится во второстепенной таблице во всех записях. А чтобы эту связь создать - необходимо глючевое поле в главной таблице с уникальными даными. Вот поэтому их пользователь и вводит вручную.
- Передаем сигналы точного времени "пи-пи-пи"
- Для тех, кто не расслышал, передаем их еще раз "пи-пи-пи"

Повторяю еще раз. Ну не должны пользователи сами вводить значения ключевых полей (суррогатного ключа). Просто не должны. Этим вы избежите огромного количества проблем в будущем.

Например, описанная проблема просто не возникнет. Какая разница, что там девченки ввели в качестве NickName. На организацию связи это вообще никаким боком не влияет. Ведь связь идет по неким "внутренним" кодам, которые пользоваитли вообще не видят

Ну, поменяют они потом у пользователя этот самый NickName. Ну и что? Это просто один из многих реквизитов, который никак, никоим образом не влияет на организацию связи.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32964139
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во-вторых, что значит удалять клиента? По нему хоть какие-то движения когда-то были? Наверняка - да, значит все - никаких удалений! История должна сохраняться, иначе что это за база данных? Нужно просто ОТКЛЮЧАТЬ неактуальные данные периодом их действия. Т.е. клиент должен иметь период действия - дату заведения и дату исключения. Пользователям показываются только те клиенты, которые подпадают под текущую дату работы системы (работать можно ведь и задним числом).

Ну это все как должно быть :)
А в Вашем случае, чтобы минимизировать переделки, можно перед удалением клиента очищать поле номера. Так сказать, освобождать номер клиента для его повторного использования, хоть и неправильно это. Еще можно хотя бы сохранять номер клиента в дополнительном поле.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32964225
Фотография help123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XAndyчто значит удалять клиента? По нему хоть какие-то движения когда-то были? А в том то и дело что в связи один-ко-многим в базе данных есть Referential Integrity. И там то можно как раз и устанавливать условия удаления. А среди них есть и условие при котором если есть какие-то движения по клиенту - то будет запрет на удаление. Я так понял что оно автоматически свой тригер пишет... XAndyчтобы минимизировать переделки, можно перед удалением клиента очищать поле номера а вот эта идея мне понравилась... спасибо.. попробуем...
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32967112
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi XAndy!

> А в Вашем случае, чтобы минимизировать переделки, можно перед удалением клиента очищать поле номера.

Это не поможет...

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32967351
Фотография help123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor KorolyovЭто не поможет... А почему не поможет? Можно ведь и не затирать в прямом смысле - а просто заменить на специально сгенерированную уникальную строку.

powered by Visual FoxPro 8.0 SP1
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32967461
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
help123 Igor KorolyovЭто не поможет... А почему не поможет? Можно ведь и не затирать в прямом смысле - а просто заменить на специально сгенерированную уникальную строку.
Слушай, а самому чуть-чуть подумать?

Твоя проблема возникла от того, что записи физически не удаляются, а лишь помечаются как удаленные. Теперь представь, что ты перед удалением очищаешь это поле. Один раз - замечательно. А второй - получишь сообщение об ошибке, что такое поле уже есть. То самое - очищенное, что было удалено ранее. Пустое значение - это тоже значение! А значение NULL для Primary-индексов - недопустимо!

Так что, по сути, у тебя только 2 принципиальных решения:

либо не давать пользователям править ключевое поле

либо в случае возникновения подобного конфликта попросить выполнить очистку базы данных от записей ранее помеченных как удаленные

Большая просьба. Прежде чем начать говорить, что это невозможно, да это требует эксклюзивного доступа и т.д. и т.п. Ответьте себе на несколько вопросовю


Насколько часто возникает подобная ситуация?

Стоит ли писать очень сложный код для решения этой проблемы, если ситуация крайне редкая?
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32967595
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, это только в совсем нормализированных таблицах комбинация полей в записи зависит от первичного ключа и только от него. А на практике бывают еще и кандидатные индексы. Я, например, сторонник такого подхода:
PK - суррогатный.
Кандидатный ключ - как правило, один на таблицу, но даже если и больше - строится с условием FOR NOT DELETED().
Прошу покритиковать ;-)
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32967602
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавление к предыдущему посту: в случае, если PK в таблице суррогатный, наличие кандидатного ключа становится просто-таки обязательным.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32967632
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UrriКстати, это только в совсем нормализированных таблицах комбинация полей в записи зависит от первичного ключа и только от него. А на практике бывают еще и кандидатные индексы. Я, например, сторонник такого подхода:
PK - суррогатный.
Кандидатный ключ - как правило, один на таблицу, но даже если и больше - строится с условием FOR NOT DELETED().
Прошу покритиковать ;-)
Почитай здесь

Раздел "Ключевые поля"
http://www.foxclub.ru/kb/index.php?sid=24056&aktion=artikel&rubrik=001&id=6&lang=ru
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968284
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир, у тебя в статье как раз вопрос о кандидатных ключах не освещен (я не увидел). А ведь, по сути дела, использование кандидатных ключей - это отличный (а порой и необходимый) способ добавить целостности в БД.
Вот например, твой пример с реализацией отношения "многие ко многим" через третью таблицу. Если в ней используем суррогатный PK, то связи с первой и второй таблицами получаются неидентифицирующими, и тогда - по обстоятельствам - надо назначать кандидатным ключом или пару ID первых двух таблиц (если конкретная запись первой должна быть связана с конкретной записью второй не более одного раза), либо эту пару и дополнительный(е) атрибут(ы).
Но, в случае удаления записи с такой комбинацией кандидатных атрибутов, нужно предусмотреть возможность повторной вставки новой записи с той же комбинацией кандидатных атрибутов - отсюда появляется условие FOR в кандидатном индексе.
А критику я хотел бы услышать по всем направлениям, в том числе, нет ли у кого адекватного варианта получше, в плане производительности, например, простоты реализации и т.п. Есть ли ситуации, которые этот подход плохо отрабатывает. Ну и т.д. ;-)
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968383
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Urri

Мне кажется, что в статье теоретическое описания вполне достаточно.

Urriпо обстоятельствам - надо назначать кандидатным ключом или пару ID первых двух таблиц (если конкретная запись первой должна быть связана с конкретной записью второй не более одного раза

Что касается Вашего примера, один-ко-дному через третью таблицу и возможность использования СК на промежуточную таблицу, то это надо рассматривать как ограничение конкретной реализации, ведь промежуточная таблица м. связывать докумнты друг с другом используя разные правила, причем взаимоисключающие друг друга.

Urriнужно предусмотреть возможность повторной вставки новой записи с той же комбинацией кандидатных атрибутов - отсюда появляется условие FOR в кандидатном индексе

По поводу удаления - "сурогатный ключ" является уникальным для данной таблицы (если исходить из такого предположения), таким образом удалив связанные документы и пересоздав их , у вновь созданных будут уже другие "сурогатные" ключи и т.о. повторение их в промежуточной таблице невозможно.

По поводу критики на использование фильтрованных индексов - их использование характерно для "естественных" ключей или если не использовать SET DELETE ON , а вводить свои признаки удаления записи, такой подход я сам использую, поэтому PK&CK у меня имеют FOR условие.

А кол-во СК особой роли не играет, если по условиям задачи их м.б. 10 значит 10.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968384
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, то наличие в нем дублей в принципе допустимо. Нужно отсечь только дубли среди НЕ удаленных записей. С чем вполне может справиться триггер.

Причем я написал "универсальный" (в пределах моей задачи) триггер. Т.е. один общий код для любых таблиц.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968434
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ

ВладимирМ Цель внешнего ключа (FK - Foreign Key) - это хранение значения PK. Все!

Вот здесь, ещё бы добавил - и обеспечение ссылочной целостности.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968481
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist ВладимирМ
ВладимирМ Цель внешнего ключа (FK - Foreign Key) - это хранение значения PK. Все!
Вот здесь, ещё бы добавил - и обеспечение ссылочной целостности.
Нет. Обеспечение ссылочной целостности - это отдельный процесс ! FK - это элемент этого процесса. Но он никак, никоим образом, не может обеспечить ссылочную целостность.

Ведь в организации ссылочной целостности участвует и PK, но тебе и в голову не приходит добавлять, что цель PK - это обеспечение ссылочной целостности!

Вообще-то, чем меньше использовать разной "терминологии" (пусть и официально признанной), а просто рассказывать что и для чего делаешь, то, как правило, и сам понимаешь в чем ошибся и тебя быстрее понимают и поправляют.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968572
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ

ВладимирМОбеспечение ссылочной целостности - это отдельный процесс! FK - это элемент этого процесса.

Развивая мысль, PK это ведь тоже отдельный процесс, причем

ВладимирМЦель ключевого поля (PK - Primary Key) - однозначная идентификация записи

так вот эта однозначная идентификация ключевого поля, просто использует тот или иной механизм для обеспечения цели, точно так же FK использует свой механизм для обеспечения своей цели, а не просто хранить PK (вроде как получается может хранить РК, а может хранить ещё что_нибудь), поэтому FK как и PK это необходимая часть ссылочной целостности, и говорить о них в отрыве друг от друга, значит использовать просто поля в двух разных таблицах.

ВладимирМВедь в организации ссылочной целостности участвует и PK, но тебе и в голову не приходит добавлять, что цель PK - это обеспечение ссылочной целостности!

В общем случае нет не приходит, а в частном случае (RI) должно приходить или у тебя есть возражения.

авторВообще-то, чем меньше использовать разной "терминологии" (пусть и официально признанной), а просто рассказывать что и для чего делаешь, то, как правило, и сам понимаешь в чем ошибся и тебя быстрее понимают и поправляют.

Поэтому мы здесь и общаемся.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968616
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist
В принципе, есть к чему придраться Однако так можно продолжать до бесконечности. Мы друг друга поняли, а уточнение формулировок - это уже детали...

В данном случае меня поразила терминология Urri и очень своеобразные выводы исходя из его собственной терминологии и некой абстрактной задачи. Вот я и попытался перевести дискуссию в рамки некой конкретики, чтобы уточнить, что же именно он хотел сказать.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968640
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ

Согласен.

Честно сказать я тоже не понял приведенный пример, как иллюстрацию необходимости использования FOR индексов, видимо структура данных или её развитие было построено таким образом, что бы "малой кровью" через СК быстро решить проблему.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968645
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОК, для объяснения своей путаной терминологии приведу пару примеров.
Простейший справочник чего-то. Атрибутов всего 2: Наименование и значение.

Код: plaintext
1.
2.
3.
4.
5.
6.
Имя таблицы: DataDir
========================
DataDirID Integer [pk]
------------------------
Name Character( 32 )
Value Integer
========================

В моей терминологии поле Name является кандидатным ключом таблицы DataDir, потому что значения этого поля должны быть точно так же уникальны, как и значения суррогатного ключа DataDirID. Потому что именно поле Name пользователи видят через интерфейс и именно это поле отражает для них сущность элемента справочника. И двух одинаковых Name быть не должно. Представим, что мы реализуем стратегию "пользователь должен иметь право на ошибку всегда, если это возможно". Допустим также, что элементы справочника можно удалять и добавлять по-новой. Тогда пользователь имеет возможность удалить элемент, понять, что ошибся и добавить то же имя. Естественно, с новым DataDirID.

Строим индексы (с учетом поправки Владимира М):
Код: plaintext
1.
2.
3.
 1 . DataDirID (DataDirID) - Primary key;
 2 . Candidate (Name) - FOR.NOT.DELETED() - Candidate key;
 3 . Name (Name) - Простой индекс, без FOR-условия.
   Примечание: строится в целях оптимизации, равен по выражению индексу Candidate.

Все.
Как резонно заметил 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.
Table1 ->-----<- Table2 разрешается как

Table1 ---<- Table3 ->--- Table2
При этом минимально структура Table3 должна быть:
- при идентифицирующем отношении:
Table1ID [pk, fk]
Table2ID [pk, fk]
------------------------

- при неидентифицирующем отношении (с суррогатным ключом):
Table3ID [pk]
------------------------
Table1ID [fk]
Table2ID [fk]
Но эти две схемы не будут равноценными, пока мы не добавим кандидатный индекс по (Table1ID, Table2ID), типа:
Код: plaintext
INDEX ON str(Table1ID)+str(Table2ID) FOR NOT DELETED() CANDIDATE
- иначе во второй схеме можно будет сделать две связи или более между теми же записями в Table1ID и Table2ID.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968736
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По первому пример понятно. Обсуждалась такая проблема. Я ее реализовал через триггер. Т.е. вместо 2 индексов для каждой таблицы я сделал по одному индексу для каждой таблицы и один общий триггер на все таблицы.

По второму примеру опять ничего не понял. Какое отношение имеет PK в таблице-посреднике к организации связи? Он там вводится совсем не для этого!

Вы делаете ничем не обоснованное допущение, что пара FK должны быть уникальны в пределах таблицы-посредника. Почему собственно?

По ссылке я привел пример: один клиент имеет несколько счетов в одном и том же банке. Т.е. в таблице-посреднике несколько одинаковых пар FK плюс дополнительное поле со счетом. Вы хотите создать индекс включающий ВСЕ поля таблицы-посредника?
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968742
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Urri

Urri Допустим также, что элементы справочника можно удалять и добавлять по-новой.

На мой взгляд вот здесь логическая ошибка, если ссылка на справочник попала в дочернюю таблицу, то при модификации самого справочника ограничение RI должно модифицировать (запретить) все записи в дочерней таблице, какой бы ключ не использовался PK/CK.

Пошли дальше, кандидат ключ Name не используется в таблице3, поэтому его ограничение может быть организовано как хочется.

Ограничение кандидата на таблицу3 в данном конкретном случае показывает, что таблица3 не нужна, поскольку этого же можно добиться связывая таб1 и таб2 и накладывая ограничение на их поля.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968757
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМПо первому пример понятно. Обсуждалась такая проблема. Я ее реализовал через триггер. Т.е. вместо 2 индексов для каждой таблицы я сделал по одному индексу для каждой таблицы и один общий триггер на все таблицы.
Интересно понять, как он работает, этот триггер (если Вы его описывали, то я пропустил).

ВладимирМПо второму примеру опять ничего не понял. Какое отношение имеет PK в таблице-посреднике к организации связи? Он там вводится совсем не для этого!
Вы делаете ничем не обоснованное допущение, что пара FK должны быть уникальны в пределах таблицы-посредника. Почему собственно?
По ссылке я привел пример: один клиент имеет несколько счетов в одном и том же банке. Т.е. в таблице-посреднике несколько одинаковых пар FK плюс дополнительное поле со счетом. Вы хотите создать индекс включающий ВСЕ поля таблицы-посредника?
Если таблица может иметь несколько одинаковых пар FK, значит, должен существовать еще по крайней мере один атрибут, с которым комбинация становится уникальной, и он(они) также должен быть добавлен в кандидатный ключ. Полностью одинаковых строк в таблице быть не должно - это нарушение одной из первых нормальных форм (никогда не мог запомнить, какой именно ;-)).
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968761
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: суррогатный ключ не в счет - он ведь только суррогатный ;-)))
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968773
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist Urri Допустим также, что элементы справочника можно удалять и добавлять по-новой.

На мой взгляд вот здесь логическая ошибка, если ссылка на справочник попала в дочернюю таблицу, то при модификации самого справочника ограничение RI должно модифицировать (запретить) все записи в дочерней таблице, какой бы ключ не использовался PK/CK.

А он еще не попал в дочернюю таблицу. ;-) (А если успел попасть, тут, конечно, должна вступить в действие проверка RI).

PaulWistПошли дальше, кандидат ключ Name не используется в таблице3, поэтому его ограничение может быть организовано как хочется.Второй пример с первым никак не связан.

PaulWistОграничение кандидата на таблицу3 в данном конкретном случае показывает, что таблица3 не нужна, поскольку этого же можно добиться связывая таб1 и таб2 и накладывая ограничение на их поля.А тут Вы неправы.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968837
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Urri А он еще не попал в дочернюю таблицу.

а мы эту запись удалили, поскольку в дочернюю таблицу д. попасть ID справочника, то ввод нового (в смысле удаленной записи) получит свой новый ID и никак не повлияет на ограничение PK.

Urri А тут Вы неправы.

ну значит я не понял о чем идет речь. Приведите тестовый пример.
Мне это видиться так

Table1
T1.ID + T1.ID_T2 => candidat
Table2
T2.ID + T2.ID_T1 => candidat
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968884
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 уже была. А никаких дополнительных атрибутов в нашем примере нет.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32968970
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Urri ВладимирМПо первому пример понятно. Обсуждалась такая проблема. Я ее реализовал через триггер. Т.е. вместо 2 индексов для каждой таблицы я сделал по одному индексу для каждой таблицы и один общий триггер на все таблицы.
Интересно понять, как он работает, этот триггер (если Вы его описывали, то я пропустил).
Да также, как и индекс Candidat. Выполняет Select-SQL (или LOCATE FOR) на премет поиска записи с текущими начениями контролируемого выражения, исключая текущую запись.

Поскольку по искомому выражению есть индекс, то это обеспечивает выполнение следующих условий:

-) Высокая скорость поиска
-) Невозможность других пользователей внести дубль, пока выполняется проверка (проверка идет внутри транзакции). Блокируется индекс.

UrriЕсли таблица может иметь несколько одинаковых пар FK, значит, должен существовать еще по крайней мере один атрибут, с которым комбинация становится уникальной, и он(они) также должен быть добавлен в кандидатный ключ. Полностью одинаковых строк в таблице быть не должно - это нарушение одной из первых нормальных форм (никогда не мог запомнить, какой именно ;-)).
Ну, Вы, блин, даете! (с)

Повторяю еще раз:

Вы хотите создать индекс включающий ВСЕ поля таблицы-посредника?
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32969025
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ UrriЕсли таблица может иметь несколько одинаковых пар FK, значит, должен существовать еще по крайней мере один атрибут, с которым комбинация становится уникальной, и он(они) также должен быть добавлен в кандидатный ключ. Полностью одинаковых строк в таблице быть не должно - это нарушение одной из первых нормальных форм (никогда не мог запомнить, какой именно ;-)).
Ну, Вы, блин, даете! (с)

Повторяю еще раз:

Вы хотите создать индекс включающий ВСЕ поля таблицы-посредника?
Нет, только для комбинации, обеспечивающей уникальность строки.
Да, если в таблице уникальность строки обеспечивается только полной совокупностью атрибутов (кроме суррогатного PK, конечно).

За разъяснения по поводу триггера - спасибо.
С относительным минусом моего подхода все ясно: "лишний" индекс со всеми вытекающими. С относительным плюсом - тоже: не требуется создавать другие объекты (например, триггеры). Попробую сравнить производительность наших подходов на досуге.
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32969110
Cyv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UrriС относительным минусом моего подхода все ясно: "лишний" индекс со всеми вытекающими
Никакой он не лишний :) И наиболее правильный ответ на поставленный в топике вопрос.
Естественный реквизит (или группа реквизитов) - "продавец с кодом",
претендующий на уникальность потому и называется candidate,
потому что претендует на ПК, но никогда им не будет :) - мы же правильные -
и заведём суррогатный ключ для этой цели, а его (или группу) -
сделаем кандидатом и конечно FOR NOT DELETED.

То есть всегда, когда есть визуальный конкурент у скрытого ПК, надо делать два индекса.

То же самое в отношении группы внешних ключей, если необходимо
обеспечить уникальность.
BINTOC(fk1_id)+BINTOC(fk2_id) - кандидат и FOR NOT DELETED.

Штатный подход. При чём тут какие-то триггеры?

Тормозов никаких нет и быть не может. Всё реально работает и летает
на базе 184 табл./~1 гиг/161 пользователь (на сегодняшний день).
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32969898
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi help123!

> А почему не поможет? Можно ведь и не затирать в прямом смысле - а просто заменить на специально сгенерированную уникальную строку.

Так работать будет, но ведь изначально это не было написано :)
И что самое важное - это (возможность так сделать) НЕ предлог для отказа от идей суррогатного ключа - для которого никаких подобных извращений просто НЕ ТРЕБУЕТСЯ.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32969899
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Urri!

Расслабься, всё у тебя нормально и правильно - просто Многоуважаемые коллеги тебя очевидно не совсем правильно понимают (или не хотят понять :) )...
Да, для асоциативных таблиц твоя схема (что первая что вторая) вполне правильна - просто в первой (БЕЗ суррогатного ключа) потребуется на PK фильтр накладывать, и что ещё более неприятно - использовать "составной" PK - это конечно не смертельно, и если ассоциативная сущность НИКОГДА не обрастёт доп. атрибутами, не потребует привязки к себе новых сущностей и т.п. - то вполне можно наплевать на сложность - тем самым сэкономив одно поле... Но обычно вылазят всякие "левые" задачи, и становится необходимо ссылаться на элемент ассоциативной таблицы (да банально - лог "какой нехороший юзер создал эту связь", или чуть сложнее - задачи репликации) - тогда вариант с "выделенным" простым PK (суррогатным) явно выигрывает. Кроме того если ВСЕ таблицы имеют суррогатный PK это упрощает многое - в частности классы по работе с данными - всегда ясно что запись идентифицирует именно один простой Integer, а не "тут C(10) - там N(14) а ещё где-то D+N(10)+C(32)".

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
удаление...вставка...вопрос об уникальности индекса...
    #32970474
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Urri

Urri Запись с Table1ID = 1, Table2ID = 1 уже была. А никаких дополнительных атрибутов в нашем примере нет.

Да, это действительно правильно, просто я не понял, что Ваш первый пример никак не связан со вторым примером, а приведенная схема и у меня используется.

Вообщем, Igor Korolyov подвел итог дискуссии.
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / удаление...вставка...вопрос об уникальности индекса...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]