powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
62 сообщений из 62, показаны все 3 страниц
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39390934
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имею Tabular Form с функциями добавления, модификации и удаления строк.
Каждая новая запись получает значение PK в момент создания на клиенте, а не триггером или последовательностью на сервере.
Как при обработке строк в процедуре MRU отличить новые от существующих?
ROWID закачать в поле TF не получается.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39390996
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльROWID закачать в поле TF не получается.
Это почему?
У меня в 4-ке с геморроем, но выходило добавлять любые столбцы. Просто они не редактируемые.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39391004
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Даёт только виртуальные добавить.
А я ступил :)
Просто достаточно в запрос добавить любое поле, хоть "1" хоть rownum и не инициализировать его в новой строке - вот и отличие!
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39392661
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КурдльКаждая новая запись получает значение PK в момент создания на клиенте

Это вы сами такое сделали, или просто выдумываете?
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39392680
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blkangelКурдльКаждая новая запись получает значение PK в момент создания на клиенте

Это вы сами такое сделали, или просто выдумываете?
Это решение продиктовано моделью.
А модель - продукт анализа требований и проектирования.
А что Вас смущает? Приведу пару примеров:
1. Таблица имеет натуральный ключ, вводимый на клиенте.
2. Таблица имеет композитный ключ из 2-х (или более) FK (ассоциация или depended-relationship), значение которых синтезируется на клиенте.

Есть приверженцы стиля "каждая таблица должна иметь суррогатный ключ". Я - не из них. Во всяком случае для OLTP-систем.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39392840
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльЭто решение продиктовано моделью.
...
Во всяком случае для OLTP-систем.
Сомневаюсь.
Кроме большого количества проблем разного рода, включая проблемы с оптимизатором (в том числе проблем со стоимостью, join elemination и др.), я уже не говорю про вагон и маленькую тележку очевидных проблем не связанных с апексом, не встречал ни одного полезного свойства (при том, что работать с ними приходилось много).
Это всё скорее ошибки проектирования, имхо.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39392842
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уже ничего, у вас даже обозначение ключей свое.
Вместо "Естественный" - "Натуральный", "Составной"-композитный
Да я приверженец Сурогатных ключей.


авторКак при обработке строк в процедуре MRU отличить новые от существующих?
А никак, вы же не любитель сурогатных ключей, ну вот теперь и сношайтесь :)
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39392858
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blkangelА никак, вы же не любитель сурогатных ключей, ну вот теперь и сношайтесь :)
Ну я относительно легко "высношался" из этой ситуации :)

Но дело не в любви/нелюбви.
Я волей случая привязан к определенному CASE-инструменту проектирования БД.
Причем я строго следую порядку "от логической модели - к физической" и поддерживаю постоянное соответствие между этими моделями.
И этот инструмент генерирует именно композитный (составной) ПК без суррогатного, если в логической модели встречается ассоциативная связь. Лезть в физическую модель и менять её "руками" иногда приходится, но я стараюсь минимизировать такое вмешательство.
Если не поленюсь разобраться и настроить его по-другому - буду далее любить суррогатные :)
Я даже предпринимаю попытки, но руки не доходят: SQL.ru Проектирование БД
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39392893
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

По теме: В апексе тяжело будет работать с составными ключами.

Начиная с какой-то версии (скорее всего 4.1 или раньше) есть выбор при создании Tabular Form: на основе ROWID или PK.
Для остальных случаев (например, выпадающих списков), можно создать обновляемое представление, и представить в виде PK что угодно. При этом заполнять PK можно в instead of триггере, а не на клиенте, на основе, например, скрытых полей, для которых проставлен default или hidden items. Впрочем instead of - это достаточно тяжелый метод, сильно усложняет разработку, проще переделать на простые ключи, если еще не поздно.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39392933
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevКурдль,

По теме: В апексе тяжело будет работать с составными ключами.


Я знаю! Мне уже тяжело, но пока справляюсь. :)
(Слава АПЕКСу, что дает заводить хотя бы двойной композитный ПК!)
Приведу пример очень простой.
Связь персоны и государства типа "гражданство".
При этом бизнес-процессу не интересно, когда получено и т.п. Только чистый факт "кто гражданин какой страны".
Таким образом имеем чистую ассоциацию из много-ко-многим, физически реализуемую в таблице CITIZENSHIP.
Экземпляр записи в этой таблице вообще никому не интересен сам по себе. Т.е. её собственный идентификатор по логике не нужен.
Интересен только ID_персоны и ID_государства. Причем никаким генератором, триггером или последовательностью им значения присвоить нельзя.
Кроме того, пара "ID_персоны и ID_государства" должна быть уникальной, т.к. невозможно быть "дважды гражданином одной и той же страны" :)
Улавливаете мысль?
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39392947
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльСвязь персоны и государства типа "гражданство".
При этом бизнес-процессу не интересно, когда получено и т.п. Только чистый факт "кто гражданин какой страны".
один ко многим на справочник Государства. Или FK в справочнике Персоны.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39392969
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123один ко многим на справочник Государства. Или FK в справочнике Персоны.
С какого перепугу? И вообще, я не понял, как ты предлагаешь физически реализовать модель, если логически это однозначно "много-ко-многим"?
P.S. Мы, - специалисты по проектированию БД, никогда не употребляем слово "справочник", если только не имеем дело конкретно с НСИ, например. ;)
В лог.модели есть сущности.
В физ. модели есть таблицы.
В OLAP есть факты и измерения.
Справочников нет нигде :)
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393006
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльС какого перепугу? И вообще, я не понял, как ты предлагаешь физически реализовать модель, если логически это однозначно "много-ко-многим"?
Ну тогда давай в теорию)).
Начинают проектировать с понятия Сущность. Потом логическая модель.
Ты назвал 2 сущности:
КурдльТолько чистый факт "кто гражданин какой страны".
получили отношение.
Разве не удовлетворяет?
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393008
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльСправочников нет нигде :)
у БА есть.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393069
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123КурдльС какого перепугу? И вообще, я не понял, как ты предлагаешь физически реализовать модель, если логически это однозначно "много-ко-многим"?
Ну тогда давай в теорию)).
Начинают проектировать с понятия Сущность. Потом логическая модель.
Ты назвал 2 сущности:
КурдльТолько чистый факт "кто гражданин какой страны".
получили отношение.
Разве не удовлетворяет?

Вообще-то я получил сначала одно отношение:

ПЕРСОНА >--------< СТРАНА

а после детального проектирования - 2 отношения:

ПЕРСОНА ----< ГРАЖДАНСТВО >---- СТРАНА

где "гражданство" - не полноценная сущность, а ассоциация

P.S. Если ты имеешь в виду бизнес-аналитиков, то бить им по рукам (губам), чтобы запомнили: справочник - это вид представления данных :)
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393092
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдльа после детального проектирования - 2 отношения:

ПЕРСОНА ----< ГРАЖДАНСТВО >---- СТРАНА

где "гражданство" - не полноценная сущность, а ассоциация
вот это ошибка пректирования, но дело твоё.
1. Выделяют сущности только ценные для бизнеса (не для программиста).
2. Слово детальное - не обоснование выделения 3-ей сущности.
Т.е. выводит бизнес гражданство на экран - выбрось остальное.
КурдльP.S. Если ты имеешь в виду бизнес-аналитиков, то бить им по рукам (губам), чтобы запомнили: справочник - это вид представления данных :)
Именно. Они пишут свои каркули в ворде и словами заказчика (VIEW).
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393094
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,
Модель - это упрощённое состояние мира.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393101
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

т.е. таблица CITIZENSHIP с полями ID_персоны и ID_государства - первичный ключ ?

Какая польза здесь от составного ключа, не представляю.
Когда появятся внешние ключи - будут жрать кучу места и соответственно запросы будут выполняться медленно.
Элементарно ошибки исправлять замучаетесь, когда пользователи неправильно вводят.

Касательно уникальности, не очевидно. Гражданство может меняться, например, от гражданства можно отказаться или лишиться.
Другой пример - могут быть люди без гражданства (и это не то же самое, что данные не введены), но, например, с видом на жительство, поэтому отношения между странами и людьми могут быть не такими простыми.

Люди тоже постоянно меняют фамилию. Не редко бывают запросы от людей: когда первый раз у них одна фамилия, во втором запросе другая (и другой паспорт), соответственно их часто заводят как разных людей (и даже если паспорт одинаковый, такое часто бывает), а потом нужно объединить => меняется идентификатор человека.

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

Касательно апекса, если делать по вашему, можно сделать вью: PK - составное поле через разделитель, и отдельно поля, сделать вью обновляемой. Соответственно в Tabular Form первичный ключ - составное поле из view, для новых строк будет null, указать, что генерируется на основании триггера. view пересчитывает значение уже после внесения записи, соответственно, MRU смотрит, если поле первичного ключа null - запись новая, если не null - существующая.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393134
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Т.е. выводит бизнес гражданство на экран - выбрось остальное.

Т.е. оставить сущность ГРАЖДАНСТВО?
И что за атрибуты должны быть?
- ФИО Персоны
- Наименование страны?
:)
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393149
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,
По твоему ТЗ так:

Спр-к Персоны
ID ФИО Гражданство(FK)2 Петров РФ3 Сидров5 Иванов "то что в паспорте"
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393187
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Курдль,
По твоему ТЗ так:

Спр-к Персоны
ID ФИО Гражданство(FK)2 Петров РФ3 Сидров5 Иванов "то что в паспорте"

А как с персонами, имеющими > 1 гражданства?
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393195
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльА как с персонами, имеющими > 1 гражданства?
один ко многим.
- в обоих таблах PK триггером
- в VIEW через запятую
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393207
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ID ФИО Гражданство(FK)2 Петров РФ3 Сидров5 Иванов "то что в паспорте"
Даже в таком варианте, если заменить в FK естественный ключ на суррогатный, для программиста будет +.
Сожмёт таблицу, улучшит производительность. Рано или поздно понадобится изменить значение => облегчит модификацию в справочнике гражданств.

Если нужно что-то кроме РФ, то логично появление нескольких записей для одного человека.
Насколько детально нужно проектировать может знать только ТС.
В более серьезных ситуациях вносится не само гражданство, а документы, удостоверяющие наличие гражданства (паспорт и др.), а само гражданство уже можно взять оттуда.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393212
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123КурдльА как с персонами, имеющими > 1 гражданства?
один ко многим.
- в обоих таблах PK триггером
- в VIEW через запятую

Я не понял, в таблице ГРАЖДАНСТВО надо создать новую запись, в ней в поле "страна" занести текстовое название страны, а потом эту запись по FK связать с персоной?
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393216
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDev,
у меня в примере суррогатный от генератора в триггере.
"РФ" это уже на клиенте.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393240
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльЯ не понял, в таблице ГРАЖДАНСТВО надо создать новую запись, в ней в поле "страна" занести текстовое название страны, а потом эту запись по FK связать с персоной?
ВАР1
==============
При варианте один ко многим (у лица несколько гражданств) заводим справочник Страны.
Персона 1---> М Гражданство M<----1 Страны
чтобы не вводить руками.

ВАР2
==============
в апекс ввести перечень констант-массив и обойтись без 1 Страны
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393290
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevДаже в таком варианте, если заменить в FK естественный ключ на суррогатный, для программиста будет +.
Сожмёт таблицу, улучшит производительность. Рано или поздно понадобится изменить значение => облегчит модификацию в справочнике гражданств.

Я не понимаю, как это сожмет таблицу и улучшит производительность.
Мне так и так придется делать уникальный индекс на ID_персоны и ID_страны в ассоциативной таблице.
А с Вашим предложением - еще добавляется ПК и его индекс.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393331
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,
при желании можно забить в LOV перечень стран и поставлять в tabular form хоть "ru" хоть число "203"
https://www.artlebedev.ru/tools/country-list/
Вопрос с сабжем Id на клиенте - нежелателен.
(без веских причин)
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39393337
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

В том варианте справочник гражданств маленький, и занимает очень мало места.
Справочник людей относительно большой, много людей имеют одно гражданство.

Код: plsql
1.
Select dump('СССР'), dump(100) from dual



Typ=96 Len=8: 208,161,208,161,208,161,208,160Typ=2 Len=2: 194,2
Соответственно, данные в значительно большей таблице занимают больше места => нужно смотреть по большой таблице.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394193
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDev,

Я извиняюсь, но Вы похоже не заметили, как наступил XXI век :)
Сейчас считать байты на запись - моветон.
Гораздо страшнее допустить логическую ошибку в модели, чем "потратить" парочку лишних гигабайт.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394236
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

Байты считать в СУБД- не моветон. Чем больше Гб будет лопатить sql, тем хуже будет производительность.
Пара лишних ГБ умножить на несколько тыщ запросов от каждого пользователя...

Если интересует только логические ошибки, то артефакты обновления уже вполне себе логическая ошибка. Недооценена вероятность потерять уникальность - другая логическая ошибка.

Простые естественные ключи может и не такое большое зло, как составные, но, кроме действительно редких случаев использовать не стоит, имхо.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394359
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КурдльSvDev,

Я извиняюсь, но Вы похоже не заметили, как наступил XXI век :)
Сейчас считать байты на запись - моветон.
Гораздо страшнее допустить логическую ошибку в модели, чем "потратить" парочку лишних гигабайт.


Увы, 21 век, а программист делающий БД на натуральных и составных ключах, не думает о том, что это как раз логическая ошибка...
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394410
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blkangelУвы, 21 век, а программист делающий БД на натуральных и составных ключах, не думает о том, что это как раз логическая ошибка...
Речь идет не о программистах, а об архитекторах БД.
Программисты, в отличие от архитекторов, имеют право не понимать, что такое "логическое моделирование".
Логическая ошибка - это ошибка в определении логических взаимосвязей между сущностями предметной области.
Например - счесть "гражданство" свойством "персоны" (её совершают в основном те, кто сначала учился ООП, а потом - моделированию данных).
Натуральные ключи - манна небесная для корпоративных информационных систем, включающих в себя множество интегрированных АС, а т.ж. DWH.
Составные ключи - наиболее надежное с точки зрения целостности данных физическое воплощение отношения типа "depended".
Тешу себя надеждой, что просто не смог донести до Вас свою мысль.
Продемонстрирую приложенной моделью. Как Вы иначе сможете смоделировать такое отношение сущностей предметной области?
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394458
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,
- вы не говорили, что в БЛ требуется "Наименование государства". Если требуется, то табла3 нужна. Если нет, то табла3 не нужна.
- в табле Гражданство не обозначены поля
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394462
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
п.п. 1 писал выше - на Ваше усмотрение. Можно расшифровывать в БД третьей таблицей справочником. Можно на АппСервере или среднем слое (APEX).
IMHO
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394473
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Курдль,
- вы не говорили, что в БЛ требуется "Наименование государства". Если требуется, то табла3 нужна. Если нет, то табла3 не нужна.
- в табле Гражданство не обозначены поля

1. Предположим, что по БЛ табла3 не нужна. Тогда какой должна быть модель? Как приложена ниже? Это денормализация, влекущая за собой возрастание объема БД (раз уж мы о нем заговорили).
2. На логической модели не таблы, а сущности. Я говорил, что экземпляр сущности "гражданство" не несет в себе никакой информации, кроме связи физлица с государством. А это отображается нотацией references типа depended. Никакие поля (для лог. модели - атрибуты) здесь не нужны.
На физической модели в таблице "гражданство" появились бы 2 поля: ID_физлица и ID_государства в виде составного PK
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394612
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль1. Предположим, что по БЛ табла3 не нужна.я писал про ненужность атрибута Наименование государства. А ты его опять прилепил.
Будет так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
ФизЛицо
ID
ФИО

Гражданство
ID_ФизЛицо number
Гражданство varchar(2)


один ко многим
- во вторую таблу можно добавить генератор ID (по вкусу)
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394617
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльНа физической модели в таблице
пускай появляются. Мне лень разбивать на логику и физику. Мы не в той теме.
Если там были пустые поля из за моделирования, то ОК.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394663
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Курдль1. Предположим, что по БЛ табла3 не нужна.я писал про ненужность атрибута Наименование государства. А ты его опять прилепил.
Будет так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
ФизЛицо
ID
ФИО

Гражданство
ID_ФизЛицо number
Гражданство varchar(2)


один ко многим
- во вторую таблу можно добавить генератор ID (по вкусу)

Да пофиг, как поле называется
"Наименование государства VARCHAR(2)"
или
"Гражданство VARCHAR(2)"
Ты ж всё равно в него будешь писать "Российская Федерация или Княжество Андорра" :)
Т.е. для всех граждан РФ (~140 000 000 чел.) у тебя в таблице "Гражданство" будет своя запись "ID_ФизЛицо; "Российская Федерация".
Так?
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394682
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльТ.е. для всех граждан РФ
мы модель кастим (натягиваем) на РФ?
- тогда как угодно. Хотите, делайте поле исключений
Гражданство
ID_ФизЛицо number
Гражданство varchar(2)
НетГражданстваРФ varchar(Y\No)
))))
но больше проблем с запросами будет чем с размером таблицы в оракле.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394683
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльТы ж всё равно в него будешь писать "Российская Федерация или Княжество Андорра" :)
нет
у меня в примере двухсимволний КОД государства из ссылки выше
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394699
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльЛогическая ошибка - это ошибка в определении логических взаимосвязей между сущностями предметной области.
Продемонстрирую приложенной моделью. Как Вы иначе сможете смоделировать такое отношение сущностей предметной области?
Не вижу никаких проблем в наличии простого первичного ключа ID или citizenship_id в этой модели. Уверен, в вашем софте есть такая возможность - указать пару свойств.

КурдльНатуральные ключи - манна небесная для корпоративных информационных систем, включающих в себя множество интегрированных АС, а т.ж. DWH.

Так ли это на самом деле? Типичная ситуация: меняется значение естественного ключа - ломается функционал в интегрированной системе, завязанный на ключ, для которой поддержка уже закончилась, что в этом хорошего ?

КурдльСоставные ключи - наиболее надежное с точки зрения целостности данных физическое воплощение отношения типа "depended".

Всеми необходимыми свойствами надежности целостности данных обладают простые ключи.
Поэтому, что такое более надёжный и наиболее надежный в этом контексте не понятно.
Я бы сказал, составные ключи менее надежны. Например, первичный ключ не должен меняться, при составном ключе - это правило рано или поздно нарушается.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394715
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevЯ бы сказал, составные ключи менее надежны.
+1
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394750
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevЯ бы сказал, составные ключи менее надежны. Например, первичный ключ не должен меняться, при составном ключе - это правило рано или поздно нарушается.

Я так и не смог довести до благородного сообщества, что в приведенном мною примере 20160306 составной первичный ключ выполняет роль и уникального индекса (ибо нельзя быть "дважды гражданином" одной и той же страны).
В этом и есть залог надежности (поддержка целостности данных).
По-вашему мне кроме этого первичного/уникального ключа зачем-то нужен суррогатный. Зачем?!!
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394776
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КурдльЯ так и не смог довести до благородного сообщества, что в приведенном мною примере 20160306 составной первичный ключ выполняет роль и уникального индекса (ибо нельзя быть "дважды гражданином" одной и той же страны).
В этом и есть залог надежности (поддержка целостности данных).
По-вашему мне кроме этого первичного/уникального ключа зачем-то нужен суррогатный. Зачем?!!
Как зачем.
- Чтобы табуляры юзать.
- чтобы иерархию делать.
- Чтобы таблицы связывать.
- Чтобымаксимально номарлизованная БД была
- ....
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394781
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сурогатный ключ, максимально упрощает как логическую так и физическую модель.
Сурогатный ключ, максимально упрощает работу программиста.
Сурогатный ключ, позволяется максимально быстро и оптимально работать БД.

автор (ибо нельзя быть "дважды гражданином" одной и той же страны).
Я для вашей целлостности, есть коснтрейн, если вы не в курсе.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394788
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльSvDevЯ бы сказал, составные ключи менее надежны. Например, первичный ключ не должен меняться, при составном ключе - это правило рано или поздно нарушается.

Я так и не смог довести до благородного сообщества, что в приведенном мною примере 20160306 составной первичный ключ выполняет роль и уникального индекса (ибо нельзя быть "дважды гражданином" одной и той же страны).
В этом и есть залог надежности (поддержка целостности данных).
По-вашему мне кроме этого первичного/уникального ключа зачем-то нужен суррогатный. Зачем?!!
Писал уже, читайте выше. Уникальность предполагается и в том, и в другом варианте, никак не спасет от того, что данные потом поменяться могут и поменяются с определенного момента. Затем же, зачем нужна нормализация модели до определенной степени, чтобы избежать проблем разного рода в дальнейшем (см. выше).
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394789
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот мне в голову пришел пример не безопасности натурального ключа.

Пользователи заведены по натуральному ключу LOGIN, он уникален. Очень любопытный сотрудник, решил насолить начальнику. Заходит в редактирование своей карточки, меняет логин на логин начальника, ставит свой пароль и вуаля. (А как по другому по натуральному ключу понять, что это не босс?). Система апдейтит пароль босса и любопытный сотрудник сидит под логином босса.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394807
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blkangelА вот мне в голову пришел пример не безопасности натурального ключа.

Пользователи заведены по натуральному ключу LOGIN, он уникален. Очень любопытный сотрудник, решил насолить начальнику. Заходит в редактирование своей карточки, меняет логин на логин начальника, ставит свой пароль и вуаля. (А как по другому по натуральному ключу понять, что это не босс?). Система апдейтит пароль босса и любопытный сотрудник сидит под логином босса.

Странный какой-то пример...
тогда у меня есть такой пример: заходит пользователь с правами DBA и делает DROP DATABASE ...


А про constraint - тоже странно. Зачем мне плодить индексы (на uniq constraint oracle автоматически добавит индекс), если у меня и так есть уникальный первичный ключ, хоть и составной.
И что значит "может измениться"? Ну да - в данном примере физ.лиц может лишиться гражданства или вступить в другое. И что за проблема? Удаляется одна запись и создаётся другая.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394818
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльА про constraint - тоже странно. Зачем мне плодить индексы (на uniq constraint oracle автоматически добавит индекс), если у меня и так есть уникальный первичный ключ, хоть и составной.
1. индекс на уникальноть - не одно и то же с PK
2. практически всем внешним средствам разработки удобнее иметь дело с добавочным PK генератором.
Хотя для префекциониста он лишний). Я сам таким был при моделировании.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394866
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльИ что значит "может измениться"? Ну да - в данном примере физ.лиц может лишиться гражданства или вступить в другое. И что за проблема? Удаляется одна запись и создаётся другая.
Это вы сейчас думаете, что вам не нужна история, или что её можно просто удалить, через некоторое время окажется по-другому.
Думать лучше не о том, как нажать поменьше кнопок при составлении модели, а о том, чтобы получить лучший результат.
Почему результат получится хуже, уже достаточно всякой информации приведено, имхо.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394900
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevЭто вы сейчас думаете, что вам не нужна история, или что её можно просто удалить, через некоторое время окажется по-другому.
Думать лучше не о том, как нажать поменьше кнопок при составлении модели, а о том, чтобы получить лучший результат.
Почему результат получится хуже, уже достаточно всякой информации приведено, имхо.

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

Вариантность данных во времени - серьезное бизнес-требование. Если его моделировать каждый раз "на всякий случай", OLTP-стсиемы требовали бы в 10 раз больше дискового пространства.

Однако для меня не очевиден Ваш постулат о том, что моя модель помешает накоплению истории.
Добавьте к 2-м полям составного ключа третье - типа "Дата окончания актуальности"... Есть и другие паттерны вариантности во времени, которые также не требуют суррогатного ключа с одним полем.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394918
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,
в чём сыр бор?
В том чтобы добавить в таблу ещё PK:
ГражданствоID_ФизЛицо numberГражданство varchar(2) со значениями ru\ka\gu\ss\kk
Хотите, добавляйте. Хотите - нет. Если tabular работает.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394941
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльОднако для меня не очевиден Ваш постулат о том, что моя модель помешает накоплению истории.
Добавьте к 2-м полям составного ключа третье - типа "Дата окончания актуальности"... Есть и другие паттерны вариантности во времени, которые также не требуют суррогатного ключа с одним полем.
"Дата окончания актуальности" нельзя будет добавить в часть ключа, т.к. поле будет null-able, к тому же перестанут работать все DML (Например, delete будет удалять 2 записи, вместо одной, а select выбирать 2, вместо одной).

Код: plsql
1.
Если его моделировать каждый раз "на всякий случай", OLTP-стсиемы требовали бы в 10 раз больше дискового пространства.


Это как раз тот пример, когда места будет занимать скорее меньше, чем больше.
Достаточно оценить вероятность появления подчиненной таблицы (в кот., например, будет в 10 раз больше записей) и насколько меньше она будет занимать места с простым ключом.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394996
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDev"Дата окончания актуальности" нельзя будет добавить в часть ключа, т.к. поле будет null-able, к тому же перестанут работать все DML (Например, delete будет удалять 2 записи, вместо одной, а select выбирать 2, вместо одной).

Я взрослый мальчик. И в проектировании БД не первый год. У меня в рукаве всегда есть паттерны, однозначно приводящие к успешному результату. Тот способ, что привёл в пример я, придуман не мной, но он как раз один из тех.
Достаточно полю EXPIRE_DATE, являющемуся частью композитного ПК, присваивать при создании новой записи значение "31/12/9999".
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39394999
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если впиливать в ТЗ и Модель требование: Дата актуальности или Признак актуальности записи, то это вообще оффтоп.
Т.к. там будет полное перепроектирование вплоть до OLAP\OLTP.
Удачи ТС!
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39395014
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

Вот и даты 31/12/9999 пошли...
Кроме кучи мороки и пакостей от составных ключей, ничего полезного я от них не видел. Кроме тех аргументов, которые опровергаются.

Из недостатков (при наличии составных внешних ключей и не только):

- потребляют лишнее место
- больше кода, который требует большего сопровождения
- плохие планы запросов
- хуже производительность
- проблемы с модификацией строки
- большие проблемы при изменении условий уникальности (что явление не редкое при доработке системы)
- могут быть проблемы с отслеживанием истории изменения строки в аудите.
- куча проблем при разработке интерфейса в приложениях, которые будут работать с такой БД (нужно выбирать несколько идентификаторов, вместо одного) под что многие компоненты не заточены.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39395166
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодаря этой теме еще раз убедился в необходимости сурогатных ключей.

КурдльМне важно, чтобы логическая модель была максимально корректной и соответствующей предметной области. Минимальное "ручное вмешательство" в физическую модель избавляет меня от ошибок проектирования.
Если CASE настроен правильно, при формировании логической модели, в физическую никаких правок не надо.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39395349
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blkangelБлагодаря этой теме еще раз убедился в необходимости сурогатных ключей.
Если CASE настроен правильно, при формировании логической модели, в физическую никаких правок не надо.

Такого быть не может, как ничего идеального. :)
Иначе Вы потратите больше времени на настройку, чем на результат.
Приведу пример на модели со сделкой, в которой несколько участников.
Case-инструмент, скорее всего, сгенерирует FK для сделки типа
SUBJ_ID_1
SUBJ_ID_2
SUBJ_ID_3
SUBJ_ID_4
А вам по naming style положено называть
SUBJ_ID_CRED
SUBJ_ID_BORR
SUBJ_ID_GTEE
SUBJ_ID_GTOR
Так что придется вмешаться ручками. Можно, конечно, обзывать осмысленными именами referenses, и настроить CASE на использование части их имен в имени поля. Но найдутся и другие грабли несоответствия лог. модели и физ. модели.
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39395443
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КурдльblkangelБлагодаря этой теме еще раз убедился в необходимости сурогатных ключей.
Если CASE настроен правильно, при формировании логической модели, в физическую никаких правок не надо.

Такого быть не может, как ничего идеального. :)
Иначе Вы потратите больше времени на настройку, чем на результат.
Приведу пример на модели со сделкой, в которой несколько участников.
Case-инструмент, скорее всего, сгенерирует FK для сделки типа
SUBJ_ID_1
SUBJ_ID_2
SUBJ_ID_3
SUBJ_ID_4
А вам по naming style положено называть
SUBJ_ID_CRED
SUBJ_ID_BORR
SUBJ_ID_GTEE
SUBJ_ID_GTOR
Так что придется вмешаться ручками. Можно, конечно, обзывать осмысленными именами referenses, и настроить CASE на использование части их имен в имени поля. Но найдутся и другие грабли несоответствия лог. модели и физ. модели.

Вы же физическое название полей прописываете, почему не прописать название FK ключа, это не настройка. Привели редчайший случай.

А откуда у вас сурогатный ключ, какой то subj_id? ))
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39395467
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blkangel,

Пример тиснул с какого-то обучающего слайда, поэтому там не видны атрибуты сущностей типа идентификаторов с кодом subj_id, deal_id ...

ОДнако в большинстве CASE-инструментов проектирования БД в логической модели FK и их поля не указываются.
Подразумевается, что они есть, раз есть relationship.
А вот при генерации физ.модели из логической, инструмент генерит и наименования полей для FK. И тут уж - как его настроишь :)
...
Рейтинг: 0 / 0
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
    #39395482
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blkangel,
это говорит о том, мальчик, что ты в Erwin и им подобных никогда не работал
...
Рейтинг: 0 / 0
62 сообщений из 62, показаны все 3 страниц
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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