Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Имею Tabular Form с функциями добавления, модификации и удаления строк. Каждая новая запись получает значение PK в момент создания на клиенте, а не триггером или последовательностью на сервере. Как при обработке строк в процедуре MRU отличить новые от существующих? ROWID закачать в поле TF не получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 12:04 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльROWID закачать в поле TF не получается. Это почему? У меня в 4-ке с геморроем, но выходило добавлять любые столбцы. Просто они не редактируемые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 12:43 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Petro123, Даёт только виртуальные добавить. А я ступил :) Просто достаточно в запрос добавить любое поле, хоть "1" хоть rownum и не инициализировать его в новой строке - вот и отличие! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 12:48 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльКаждая новая запись получает значение PK в момент создания на клиенте Это вы сами такое сделали, или просто выдумываете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 08:41 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
blkangelКурдльКаждая новая запись получает значение PK в момент создания на клиенте Это вы сами такое сделали, или просто выдумываете? Это решение продиктовано моделью. А модель - продукт анализа требований и проектирования. А что Вас смущает? Приведу пару примеров: 1. Таблица имеет натуральный ключ, вводимый на клиенте. 2. Таблица имеет композитный ключ из 2-х (или более) FK (ассоциация или depended-relationship), значение которых синтезируется на клиенте. Есть приверженцы стиля "каждая таблица должна иметь суррогатный ключ". Я - не из них. Во всяком случае для OLTP-систем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 09:12 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльЭто решение продиктовано моделью. ... Во всяком случае для OLTP-систем. Сомневаюсь. Кроме большого количества проблем разного рода, включая проблемы с оптимизатором (в том числе проблем со стоимостью, join elemination и др.), я уже не говорю про вагон и маленькую тележку очевидных проблем не связанных с апексом, не встречал ни одного полезного свойства (при том, что работать с ними приходилось много). Это всё скорее ошибки проектирования, имхо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 11:17 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Уже ничего, у вас даже обозначение ключей свое. Вместо "Естественный" - "Натуральный", "Составной"-композитный Да я приверженец Сурогатных ключей. авторКак при обработке строк в процедуре MRU отличить новые от существующих? А никак, вы же не любитель сурогатных ключей, ну вот теперь и сношайтесь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 11:18 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
blkangelА никак, вы же не любитель сурогатных ключей, ну вот теперь и сношайтесь :) Ну я относительно легко "высношался" из этой ситуации :) Но дело не в любви/нелюбви. Я волей случая привязан к определенному CASE-инструменту проектирования БД. Причем я строго следую порядку "от логической модели - к физической" и поддерживаю постоянное соответствие между этими моделями. И этот инструмент генерирует именно композитный (составной) ПК без суррогатного, если в логической модели встречается ассоциативная связь. Лезть в физическую модель и менять её "руками" иногда приходится, но я стараюсь минимизировать такое вмешательство. Если не поленюсь разобраться и настроить его по-другому - буду далее любить суррогатные :) Я даже предпринимаю попытки, но руки не доходят: SQL.ru Проектирование БД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 11:39 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Курдль, По теме: В апексе тяжело будет работать с составными ключами. Начиная с какой-то версии (скорее всего 4.1 или раньше) есть выбор при создании Tabular Form: на основе ROWID или PK. Для остальных случаев (например, выпадающих списков), можно создать обновляемое представление, и представить в виде PK что угодно. При этом заполнять PK можно в instead of триггере, а не на клиенте, на основе, например, скрытых полей, для которых проставлен default или hidden items. Впрочем instead of - это достаточно тяжелый метод, сильно усложняет разработку, проще переделать на простые ключи, если еще не поздно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 12:04 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
SvDevКурдль, По теме: В апексе тяжело будет работать с составными ключами. Я знаю! Мне уже тяжело, но пока справляюсь. :) (Слава АПЕКСу, что дает заводить хотя бы двойной композитный ПК!) Приведу пример очень простой. Связь персоны и государства типа "гражданство". При этом бизнес-процессу не интересно, когда получено и т.п. Только чистый факт "кто гражданин какой страны". Таким образом имеем чистую ассоциацию из много-ко-многим, физически реализуемую в таблице CITIZENSHIP. Экземпляр записи в этой таблице вообще никому не интересен сам по себе. Т.е. её собственный идентификатор по логике не нужен. Интересен только ID_персоны и ID_государства. Причем никаким генератором, триггером или последовательностью им значения присвоить нельзя. Кроме того, пара "ID_персоны и ID_государства" должна быть уникальной, т.к. невозможно быть "дважды гражданином одной и той же страны" :) Улавливаете мысль? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 12:53 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльСвязь персоны и государства типа "гражданство". При этом бизнес-процессу не интересно, когда получено и т.п. Только чистый факт "кто гражданин какой страны". один ко многим на справочник Государства. Или FK в справочнике Персоны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 13:06 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Petro123один ко многим на справочник Государства. Или FK в справочнике Персоны. С какого перепугу? И вообще, я не понял, как ты предлагаешь физически реализовать модель, если логически это однозначно "много-ко-многим"? P.S. Мы, - специалисты по проектированию БД, никогда не употребляем слово "справочник", если только не имеем дело конкретно с НСИ, например. ;) В лог.модели есть сущности. В физ. модели есть таблицы. В OLAP есть факты и измерения. Справочников нет нигде :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 13:19 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльС какого перепугу? И вообще, я не понял, как ты предлагаешь физически реализовать модель, если логически это однозначно "много-ко-многим"? Ну тогда давай в теорию)). Начинают проектировать с понятия Сущность. Потом логическая модель. Ты назвал 2 сущности: КурдльТолько чистый факт "кто гражданин какой страны". получили отношение. Разве не удовлетворяет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 13:37 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльСправочников нет нигде :) у БА есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 13:37 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Petro123КурдльС какого перепугу? И вообще, я не понял, как ты предлагаешь физически реализовать модель, если логически это однозначно "много-ко-многим"? Ну тогда давай в теорию)). Начинают проектировать с понятия Сущность. Потом логическая модель. Ты назвал 2 сущности: КурдльТолько чистый факт "кто гражданин какой страны". получили отношение. Разве не удовлетворяет? Вообще-то я получил сначала одно отношение: ПЕРСОНА >--------< СТРАНА а после детального проектирования - 2 отношения: ПЕРСОНА ----< ГРАЖДАНСТВО >---- СТРАНА где "гражданство" - не полноценная сущность, а ассоциация P.S. Если ты имеешь в виду бизнес-аналитиков, то бить им по рукам (губам), чтобы запомнили: справочник - это вид представления данных :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 14:28 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Курдльа после детального проектирования - 2 отношения: ПЕРСОНА ----< ГРАЖДАНСТВО >---- СТРАНА где "гражданство" - не полноценная сущность, а ассоциация вот это ошибка пректирования, но дело твоё. 1. Выделяют сущности только ценные для бизнеса (не для программиста). 2. Слово детальное - не обоснование выделения 3-ей сущности. Т.е. выводит бизнес гражданство на экран - выбрось остальное. КурдльP.S. Если ты имеешь в виду бизнес-аналитиков, то бить им по рукам (губам), чтобы запомнили: справочник - это вид представления данных :) Именно. Они пишут свои каркули в ворде и словами заказчика (VIEW). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 14:42 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Курдль, Модель - это упрощённое состояние мира. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 14:43 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Курдль, т.е. таблица CITIZENSHIP с полями ID_персоны и ID_государства - первичный ключ ? Какая польза здесь от составного ключа, не представляю. Когда появятся внешние ключи - будут жрать кучу места и соответственно запросы будут выполняться медленно. Элементарно ошибки исправлять замучаетесь, когда пользователи неправильно вводят. Касательно уникальности, не очевидно. Гражданство может меняться, например, от гражданства можно отказаться или лишиться. Другой пример - могут быть люди без гражданства (и это не то же самое, что данные не введены), но, например, с видом на жительство, поэтому отношения между странами и людьми могут быть не такими простыми. Люди тоже постоянно меняют фамилию. Не редко бывают запросы от людей: когда первый раз у них одна фамилия, во втором запросе другая (и другой паспорт), соответственно их часто заводят как разных людей (и даже если паспорт одинаковый, такое часто бывает), а потом нужно объединить => меняется идентификатор человека. Бизнес процесс не такая уж надежная штука, может поменяться, или может быть расширена область действия, или понадобится новый отчет, для которого не хватает данных. Поле ID здесь пригодится, даже если внешних ключей нет. Касательно апекса, если делать по вашему, можно сделать вью: PK - составное поле через разделитель, и отдельно поля, сделать вью обновляемой. Соответственно в Tabular Form первичный ключ - составное поле из view, для новых строк будет null, указать, что генерируется на основании триггера. view пересчитывает значение уже после внесения записи, соответственно, MRU смотрит, если поле первичного ключа null - запись новая, если не null - существующая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 14:47 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Petro123Т.е. выводит бизнес гражданство на экран - выбрось остальное. Т.е. оставить сущность ГРАЖДАНСТВО? И что за атрибуты должны быть? - ФИО Персоны - Наименование страны? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 15:10 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Курдль, По твоему ТЗ так: Спр-к Персоны ID ФИО Гражданство(FK)2 Петров РФ3 Сидров5 Иванов "то что в паспорте" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 15:23 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Petro123Курдль, По твоему ТЗ так: Спр-к Персоны ID ФИО Гражданство(FK)2 Петров РФ3 Сидров5 Иванов "то что в паспорте" А как с персонами, имеющими > 1 гражданства? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 15:45 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльА как с персонами, имеющими > 1 гражданства? один ко многим. - в обоих таблах PK триггером - в VIEW через запятую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 15:53 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Petro123ID ФИО Гражданство(FK)2 Петров РФ3 Сидров5 Иванов "то что в паспорте" Даже в таком варианте, если заменить в FK естественный ключ на суррогатный, для программиста будет +. Сожмёт таблицу, улучшит производительность. Рано или поздно понадобится изменить значение => облегчит модификацию в справочнике гражданств. Если нужно что-то кроме РФ, то логично появление нескольких записей для одного человека. Насколько детально нужно проектировать может знать только ТС. В более серьезных ситуациях вносится не само гражданство, а документы, удостоверяющие наличие гражданства (паспорт и др.), а само гражданство уже можно взять оттуда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 16:10 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Petro123КурдльА как с персонами, имеющими > 1 гражданства? один ко многим. - в обоих таблах PK триггером - в VIEW через запятую Я не понял, в таблице ГРАЖДАНСТВО надо создать новую запись, в ней в поле "страна" занести текстовое название страны, а потом эту запись по FK связать с персоной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 16:13 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
SvDev, у меня в примере суррогатный от генератора в триггере. "РФ" это уже на клиенте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 16:15 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльЯ не понял, в таблице ГРАЖДАНСТВО надо создать новую запись, в ней в поле "страна" занести текстовое название страны, а потом эту запись по FK связать с персоной? ВАР1 ============== При варианте один ко многим (у лица несколько гражданств) заводим справочник Страны. Персона 1---> М Гражданство M<----1 Страны чтобы не вводить руками. ВАР2 ============== в апекс ввести перечень констант-массив и обойтись без 1 Страны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 16:26 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
SvDevДаже в таком варианте, если заменить в FK естественный ключ на суррогатный, для программиста будет +. Сожмёт таблицу, улучшит производительность. Рано или поздно понадобится изменить значение => облегчит модификацию в справочнике гражданств. Я не понимаю, как это сожмет таблицу и улучшит производительность. Мне так и так придется делать уникальный индекс на ID_персоны и ID_страны в ассоциативной таблице. А с Вашим предложением - еще добавляется ПК и его индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 16:53 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Курдль, при желании можно забить в LOV перечень стран и поставлять в tabular form хоть "ru" хоть число "203" https://www.artlebedev.ru/tools/country-list/ Вопрос с сабжем Id на клиенте - нежелателен. (без веских причин) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 17:25 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Курдль, В том варианте справочник гражданств маленький, и занимает очень мало места. Справочник людей относительно большой, много людей имеют одно гражданство. Код: plsql 1. Typ=96 Len=8: 208,161,208,161,208,161,208,160Typ=2 Len=2: 194,2 Соответственно, данные в значительно большей таблице занимают больше места => нужно смотреть по большой таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 17:30 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
SvDev, Я извиняюсь, но Вы похоже не заметили, как наступил XXI век :) Сейчас считать байты на запись - моветон. Гораздо страшнее допустить логическую ошибку в модели, чем "потратить" парочку лишних гигабайт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 20:39 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Курдль, Байты считать в СУБД- не моветон. Чем больше Гб будет лопатить sql, тем хуже будет производительность. Пара лишних ГБ умножить на несколько тыщ запросов от каждого пользователя... Если интересует только логические ошибки, то артефакты обновления уже вполне себе логическая ошибка. Недооценена вероятность потерять уникальность - другая логическая ошибка. Простые естественные ключи может и не такое большое зло, как составные, но, кроме действительно редких случаев использовать не стоит, имхо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 21:58 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльSvDev, Я извиняюсь, но Вы похоже не заметили, как наступил XXI век :) Сейчас считать байты на запись - моветон. Гораздо страшнее допустить логическую ошибку в модели, чем "потратить" парочку лишних гигабайт. Увы, 21 век, а программист делающий БД на натуральных и составных ключах, не думает о том, что это как раз логическая ошибка... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 09:08 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
blkangelУвы, 21 век, а программист делающий БД на натуральных и составных ключах, не думает о том, что это как раз логическая ошибка... Речь идет не о программистах, а об архитекторах БД. Программисты, в отличие от архитекторов, имеют право не понимать, что такое "логическое моделирование". Логическая ошибка - это ошибка в определении логических взаимосвязей между сущностями предметной области. Например - счесть "гражданство" свойством "персоны" (её совершают в основном те, кто сначала учился ООП, а потом - моделированию данных). Натуральные ключи - манна небесная для корпоративных информационных систем, включающих в себя множество интегрированных АС, а т.ж. DWH. Составные ключи - наиболее надежное с точки зрения целостности данных физическое воплощение отношения типа "depended". Тешу себя надеждой, что просто не смог донести до Вас свою мысль. Продемонстрирую приложенной моделью. Как Вы иначе сможете смоделировать такое отношение сущностей предметной области? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 10:33 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Курдль, - вы не говорили, что в БЛ требуется "Наименование государства". Если требуется, то табла3 нужна. Если нет, то табла3 не нужна. - в табле Гражданство не обозначены поля ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 11:20 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
п.п. 1 писал выше - на Ваше усмотрение. Можно расшифровывать в БД третьей таблицей справочником. Можно на АппСервере или среднем слое (APEX). IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 11:23 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Petro123Курдль, - вы не говорили, что в БЛ требуется "Наименование государства". Если требуется, то табла3 нужна. Если нет, то табла3 не нужна. - в табле Гражданство не обозначены поля 1. Предположим, что по БЛ табла3 не нужна. Тогда какой должна быть модель? Как приложена ниже? Это денормализация, влекущая за собой возрастание объема БД (раз уж мы о нем заговорили). 2. На логической модели не таблы, а сущности. Я говорил, что экземпляр сущности "гражданство" не несет в себе никакой информации, кроме связи физлица с государством. А это отображается нотацией references типа depended. Никакие поля (для лог. модели - атрибуты) здесь не нужны. На физической модели в таблице "гражданство" появились бы 2 поля: ID_физлица и ID_государства в виде составного PK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 11:36 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Курдль1. Предположим, что по БЛ табла3 не нужна.я писал про ненужность атрибута Наименование государства. А ты его опять прилепил. Будет так: Код: sql 1. 2. 3. 4. 5. 6. 7. один ко многим - во вторую таблу можно добавить генератор ID (по вкусу) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 13:44 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльНа физической модели в таблице пускай появляются. Мне лень разбивать на логику и физику. Мы не в той теме. Если там были пустые поля из за моделирования, то ОК. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 13:46 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Petro123Курдль1. Предположим, что по БЛ табла3 не нужна.я писал про ненужность атрибута Наименование государства. А ты его опять прилепил. Будет так: Код: sql 1. 2. 3. 4. 5. 6. 7. один ко многим - во вторую таблу можно добавить генератор ID (по вкусу) Да пофиг, как поле называется "Наименование государства VARCHAR(2)" или "Гражданство VARCHAR(2)" Ты ж всё равно в него будешь писать "Российская Федерация или Княжество Андорра" :) Т.е. для всех граждан РФ (~140 000 000 чел.) у тебя в таблице "Гражданство" будет своя запись "ID_ФизЛицо; "Российская Федерация". Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 14:14 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльТ.е. для всех граждан РФ мы модель кастим (натягиваем) на РФ? - тогда как угодно. Хотите, делайте поле исключений Гражданство ID_ФизЛицо number Гражданство varchar(2) НетГражданстваРФ varchar(Y\No) )))) но больше проблем с запросами будет чем с размером таблицы в оракле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 14:26 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльТы ж всё равно в него будешь писать "Российская Федерация или Княжество Андорра" :) нет у меня в примере двухсимволний КОД государства из ссылки выше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 14:27 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльЛогическая ошибка - это ошибка в определении логических взаимосвязей между сущностями предметной области. Продемонстрирую приложенной моделью. Как Вы иначе сможете смоделировать такое отношение сущностей предметной области? Не вижу никаких проблем в наличии простого первичного ключа ID или citizenship_id в этой модели. Уверен, в вашем софте есть такая возможность - указать пару свойств. КурдльНатуральные ключи - манна небесная для корпоративных информационных систем, включающих в себя множество интегрированных АС, а т.ж. DWH. Так ли это на самом деле? Типичная ситуация: меняется значение естественного ключа - ломается функционал в интегрированной системе, завязанный на ключ, для которой поддержка уже закончилась, что в этом хорошего ? КурдльСоставные ключи - наиболее надежное с точки зрения целостности данных физическое воплощение отношения типа "depended". Всеми необходимыми свойствами надежности целостности данных обладают простые ключи. Поэтому, что такое более надёжный и наиболее надежный в этом контексте не понятно. Я бы сказал, составные ключи менее надежны. Например, первичный ключ не должен меняться, при составном ключе - это правило рано или поздно нарушается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 14:36 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
SvDevЯ бы сказал, составные ключи менее надежны. +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 14:49 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
SvDevЯ бы сказал, составные ключи менее надежны. Например, первичный ключ не должен меняться, при составном ключе - это правило рано или поздно нарушается. Я так и не смог довести до благородного сообщества, что в приведенном мною примере 20160306 составной первичный ключ выполняет роль и уникального индекса (ибо нельзя быть "дважды гражданином" одной и той же страны). В этом и есть залог надежности (поддержка целостности данных). По-вашему мне кроме этого первичного/уникального ключа зачем-то нужен суррогатный. Зачем?!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 15:08 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльЯ так и не смог довести до благородного сообщества, что в приведенном мною примере 20160306 составной первичный ключ выполняет роль и уникального индекса (ибо нельзя быть "дважды гражданином" одной и той же страны). В этом и есть залог надежности (поддержка целостности данных). По-вашему мне кроме этого первичного/уникального ключа зачем-то нужен суррогатный. Зачем?!! Как зачем. - Чтобы табуляры юзать. - чтобы иерархию делать. - Чтобы таблицы связывать. - Чтобымаксимально номарлизованная БД была - .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 15:25 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Сурогатный ключ, максимально упрощает как логическую так и физическую модель. Сурогатный ключ, максимально упрощает работу программиста. Сурогатный ключ, позволяется максимально быстро и оптимально работать БД. автор (ибо нельзя быть "дважды гражданином" одной и той же страны). Я для вашей целлостности, есть коснтрейн, если вы не в курсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 15:27 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльSvDevЯ бы сказал, составные ключи менее надежны. Например, первичный ключ не должен меняться, при составном ключе - это правило рано или поздно нарушается. Я так и не смог довести до благородного сообщества, что в приведенном мною примере 20160306 составной первичный ключ выполняет роль и уникального индекса (ибо нельзя быть "дважды гражданином" одной и той же страны). В этом и есть залог надежности (поддержка целостности данных). По-вашему мне кроме этого первичного/уникального ключа зачем-то нужен суррогатный. Зачем?!! Писал уже, читайте выше. Уникальность предполагается и в том, и в другом варианте, никак не спасет от того, что данные потом поменяться могут и поменяются с определенного момента. Затем же, зачем нужна нормализация модели до определенной степени, чтобы избежать проблем разного рода в дальнейшем (см. выше). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 15:36 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
А вот мне в голову пришел пример не безопасности натурального ключа. Пользователи заведены по натуральному ключу LOGIN, он уникален. Очень любопытный сотрудник, решил насолить начальнику. Заходит в редактирование своей карточки, меняет логин на логин начальника, ставит свой пароль и вуаля. (А как по другому по натуральному ключу понять, что это не босс?). Система апдейтит пароль босса и любопытный сотрудник сидит под логином босса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 15:37 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
blkangelА вот мне в голову пришел пример не безопасности натурального ключа. Пользователи заведены по натуральному ключу LOGIN, он уникален. Очень любопытный сотрудник, решил насолить начальнику. Заходит в редактирование своей карточки, меняет логин на логин начальника, ставит свой пароль и вуаля. (А как по другому по натуральному ключу понять, что это не босс?). Система апдейтит пароль босса и любопытный сотрудник сидит под логином босса. Странный какой-то пример... тогда у меня есть такой пример: заходит пользователь с правами DBA и делает DROP DATABASE ... А про constraint - тоже странно. Зачем мне плодить индексы (на uniq constraint oracle автоматически добавит индекс), если у меня и так есть уникальный первичный ключ, хоть и составной. И что значит "может измениться"? Ну да - в данном примере физ.лиц может лишиться гражданства или вступить в другое. И что за проблема? Удаляется одна запись и создаётся другая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 15:53 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльА про constraint - тоже странно. Зачем мне плодить индексы (на uniq constraint oracle автоматически добавит индекс), если у меня и так есть уникальный первичный ключ, хоть и составной. 1. индекс на уникальноть - не одно и то же с PK 2. практически всем внешним средствам разработки удобнее иметь дело с добавочным PK генератором. Хотя для префекциониста он лишний). Я сам таким был при моделировании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 16:11 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльИ что значит "может измениться"? Ну да - в данном примере физ.лиц может лишиться гражданства или вступить в другое. И что за проблема? Удаляется одна запись и создаётся другая. Это вы сейчас думаете, что вам не нужна история, или что её можно просто удалить, через некоторое время окажется по-другому. Думать лучше не о том, как нажать поменьше кнопок при составлении модели, а о том, чтобы получить лучший результат. Почему результат получится хуже, уже достаточно всякой информации приведено, имхо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 16:55 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
SvDevЭто вы сейчас думаете, что вам не нужна история, или что её можно просто удалить, через некоторое время окажется по-другому. Думать лучше не о том, как нажать поменьше кнопок при составлении модели, а о том, чтобы получить лучший результат. Почему результат получится хуже, уже достаточно всякой информации приведено, имхо. Мне пофиг, сколько кнопок нажимать - я не ленивый. Мне важно, чтобы логическая модель была максимально корректной и соответствующей предметной области. Минимальное "ручное вмешательство" в физическую модель избавляет меня от ошибок проектирования. Вариантность данных во времени - серьезное бизнес-требование. Если его моделировать каждый раз "на всякий случай", OLTP-стсиемы требовали бы в 10 раз больше дискового пространства. Однако для меня не очевиден Ваш постулат о том, что моя модель помешает накоплению истории. Добавьте к 2-м полям составного ключа третье - типа "Дата окончания актуальности"... Есть и другие паттерны вариантности во времени, которые также не требуют суррогатного ключа с одним полем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 17:22 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Курдль, в чём сыр бор? В том чтобы добавить в таблу ещё PK: ГражданствоID_ФизЛицо numberГражданство varchar(2) со значениями ru\ka\gu\ss\kk Хотите, добавляйте. Хотите - нет. Если tabular работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 17:37 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
КурдльОднако для меня не очевиден Ваш постулат о том, что моя модель помешает накоплению истории. Добавьте к 2-м полям составного ключа третье - типа "Дата окончания актуальности"... Есть и другие паттерны вариантности во времени, которые также не требуют суррогатного ключа с одним полем. "Дата окончания актуальности" нельзя будет добавить в часть ключа, т.к. поле будет null-able, к тому же перестанут работать все DML (Например, delete будет удалять 2 записи, вместо одной, а select выбирать 2, вместо одной). Код: plsql 1. Это как раз тот пример, когда места будет занимать скорее меньше, чем больше. Достаточно оценить вероятность появления подчиненной таблицы (в кот., например, будет в 10 раз больше записей) и насколько меньше она будет занимать места с простым ключом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 18:11 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
SvDev"Дата окончания актуальности" нельзя будет добавить в часть ключа, т.к. поле будет null-able, к тому же перестанут работать все DML (Например, delete будет удалять 2 записи, вместо одной, а select выбирать 2, вместо одной). Я взрослый мальчик. И в проектировании БД не первый год. У меня в рукаве всегда есть паттерны, однозначно приводящие к успешному результату. Тот способ, что привёл в пример я, придуман не мной, но он как раз один из тех. Достаточно полю EXPIRE_DATE, являющемуся частью композитного ПК, присваивать при создании новой записи значение "31/12/9999". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 20:03 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Если впиливать в ТЗ и Модель требование: Дата актуальности или Признак актуальности записи, то это вообще оффтоп. Т.к. там будет полное перепроектирование вплоть до OLAP\OLTP. Удачи ТС! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 20:13 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Курдль, Вот и даты 31/12/9999 пошли... Кроме кучи мороки и пакостей от составных ключей, ничего полезного я от них не видел. Кроме тех аргументов, которые опровергаются. Из недостатков (при наличии составных внешних ключей и не только): - потребляют лишнее место - больше кода, который требует большего сопровождения - плохие планы запросов - хуже производительность - проблемы с модификацией строки - большие проблемы при изменении условий уникальности (что явление не редкое при доработке системы) - могут быть проблемы с отслеживанием истории изменения строки в аудите. - куча проблем при разработке интерфейса в приложениях, которые будут работать с такой БД (нужно выбирать несколько идентификаторов, вместо одного) под что многие компоненты не заточены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 21:19 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Благодаря этой теме еще раз убедился в необходимости сурогатных ключей. КурдльМне важно, чтобы логическая модель была максимально корректной и соответствующей предметной области. Минимальное "ручное вмешательство" в физическую модель избавляет меня от ошибок проектирования. Если CASE настроен правильно, при формировании логической модели, в физическую никаких правок не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 09:57 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
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 на использование части их имен в имени поля. Но найдутся и другие грабли несоответствия лог. модели и физ. модели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 12:29 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
Курдль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? )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 13:39 |
|
||
|
Custom MRU. Как отличить новую запись TF от старой не по PK (Null\Not Null)?
|
|||
|---|---|---|---|
|
#18+
blkangel, Пример тиснул с какого-то обучающего слайда, поэтому там не видны атрибуты сущностей типа идентификаторов с кодом subj_id, deal_id ... ОДнако в большинстве CASE-инструментов проектирования БД в логической модели FK и их поля не указываются. Подразумевается, что они есть, раз есть relationship. А вот при генерации физ.модели из логической, инструмент генерит и наименования полей для FK. И тут уж - как его настроишь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 14:00 |
|
||
|
|

start [/forum/topic.php?all=1&fid=50&tid=1874441]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
191ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
80ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 333ms |

| 0 / 0 |
