powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / удаление...вставка...вопрос об уникальности индекса...
12 сообщений из 37, страница 2 из 2
удаление...вставка...вопрос об уникальности индекса...
    #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
12 сообщений из 37, страница 2 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / удаление...вставка...вопрос об уникальности индекса...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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