powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / обновление ПЕРВИЧНОГО ключа
25 сообщений из 55, страница 1 из 3
обновление ПЕРВИЧНОГО ключа
    #39632063
Wisky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу в этот раздел, т.к мне кажется эта проблема не столько привязана к БД, как к алгоритмированию. Сомневаюсь что моя проблема уникальна.
Есть таблица словаря с тремя полями (ID, CODE, VALUE).
При первоначальной инсталляции сортировка по ID и Value совпадает.
(16,123,АРБУЗ)
(32,123,БАНАН)
(48,123,ВИНОГРАД)
(64,123,ГРУША)
(80,123,ДЫНЯ)
Значение ID прорежено, т.к. ожидалась потребность редко вставлять значения. Сверху падает новая версия словаря, которая сопоставляется с текущей по CODE. Надо обеспечить, что после обновления sort by ID и sort by VALUE будут совпадать, при этом нужно минимизировать количество замен ID, т.к. на них ссылается таблица с полмиллиардом записей.
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39632068
Wisky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
До чего я додумала:
1) определили список новых и обновляемых данных;
2) высчитали ID_L и ID_R текущего значения в старом словаре, если АРБУЗ переименовали в АНАНАС, то 16 попадает в диапазон 0-32, его трогать не надо, а если АРБУЗ переименовали в ВОДЯНАЯ ЯГОДА, то 16 не попадает в диапазон 48-64, следовательно надо переставлять.
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39632096
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WiskyНадо обеспечитьНе надо...
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39632117
Wisky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1) Сформировать откорректированную временную таблицу отсортированную по NAME
2) Определить наибольший непрерывный список записей (ВЕРНЫЙ БЛОК), там где сортировки по старому ID и новому NAME совпадают. Блок верных значений делит справочник на три части (НАЧАЛЬНЫЙ БЛОК)+(ВЕРНЫЙ БЛОК)+(КОНЕЧНЫЙ БЛОК)
3) Переставить (сменить ID) последнее значение НАЧАЛЬНОГО БЛОКА на верное место (в середину)
4) Проверить следующее значение на совпадение сортировок и двигаться к началу
5) повторять такую же процедуру для КОНЕЧНОГО БЛОКА
6) в случае если вставка невозможна (нет свободного ID) - критическая ошибка
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39632125
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wiskyесли АРБУЗ переименовали в ВОДЯНАЯ ЯГОДА, то 16 не попадает в диапазон 48-64, следовательно надо переставлять.И следом перелопачивать полмиллиарда записей, чтобы заменить ссылку на справочник?

Это не выглядит хорошей идеей.
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39632155
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это MSSQL то там на связях с нужной таблицей можно задать CASCADE UPDATE, но обязательно на всех связях таблицы. Тогда просто меняешь ID в исходной таблице, а дальше само поменяется. Но это самое плохое решение из всех возможных.

По-хорошему ID менять не надо, т.к. на то он и абстрактный ключ чтобы не нести никакой смысловой нагрузки. Не надо в него вкладывать смысл "ID справочника из другого источника", надо просто добавить поле "ID справочника из другого источника" и в нем меняй.
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39632881
Wisky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изменения PK не моя пререгатива. Но то что сортировка по ID совпадает с VALUE наверное удобно, если эта сортировка требуется постоянно, а VALUE длинное. Изменение происходит крайне редко. Например справочник стран.
На текущий момент я рассматриваю такой вариант.
Сформировать временную таблицу или коллекцию id_new, id_old,name_new, status ("новая", "измена","без измен") отсортированную по name_new . Для записей "верно" id_new заполнено. Проверяю последовательно записи в статусе "Измена" на условие id_old between id_new_l and id_new_r. Если верно то id_new=id_old иначе оставить пустым. Затем проставляю пустые id_new.
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39632889
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изначальная задача у вас какая? Пока вопрос выглядит как "хочу левой ногой почесать правое ухо, до какой длины ногти стричь?"
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39632920
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WiskyИзменения PK не моя пререгатива. Но то что сортировка по ID совпадает с VALUE наверное удобно, если эта сортировка требуется постоянно, а VALUE длинное. Изменение происходит крайне редко. Например справочник стран.
ИМХО увольнять надо за такое.
WiskyНа текущий момент я рассматриваю такой вариант.
Сформировать временную таблицу или коллекцию id_new, id_old,name_new, status ("новая", "измена","без измен") отсортированную по name_new . Для записей "верно" id_new заполнено. Проверяю последовательно записи в статусе "Измена" на условие id_old between id_new_l and id_new_r. Если верно то id_new=id_old иначе оставить пустым. Затем проставляю пустые id_new.
В процессе замены учти такую ситуацию:
Код: plaintext
id_old = 2 id_new = 5 и есть записи с id_old = 5
т.е. поменяв ID с 2 на 5 ты не сможешь понять где новые 5, а где старые.
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39633123
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WiskyНо то что сортировка по ID совпадает с VALUE наверное удобно, если эта сортировка требуется постоянно, а VALUE длинное

Если уж действительно встал вопрос производительности при сортировке по строке, и хочется заменить ее сортировкой по int, то можно добавить еще одно поле "ORDER_NUM" int, перезаполнять его по порядку каждый раз при изменении VALUE (раз уж это событие такое редкое), и использовать для сортировки.

Хотя я почему-то сомневаюсь, что эта проблема с производительностью реальна. Меня терзают смутные сомнения. Скажите, а вы вообще ORDER BY используете? Или делаете запрос без ORDER BY, подметили, что порядок строк обычно соответствует ID, и теперь ради сохранения этого призрачного эффекта затеяли вот это все?
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39634526
Wisky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понимаю чужую задачу, у него динамически формируются различные группировки и при группировки по значению этого словаря он значительно теряет производительность. По поводу доп.поля выигрыша нет, проблема в вероятности масс.апдейта остаётся.
Спасибо, что напомнили о перекрестной замене, наверное поставлю запрет на выдачу new используемых в old.
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39634671
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WiskyЕсть таблица словаря с тремя полями (ID, CODE, VALUE).
(16,123,АРБУЗ)
(32,123,БАНАН)
(48,123,ВИНОГРАД)
(64,123,ГРУША)
(80,123,ДЫНЯ)
Сверху падает новая версия словаря, которая сопоставляется с текущей по CODE.

Только сейчас обратил внимание. А как новая версия сопоставляется по CODE, если CODE не уникальный - везде 123?
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39634868
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
совершенно не ясно, с какого перепою ID это primary key.

primary key должно быть или name (если оно уникально) или code (если оно уникально). ID переименовать в SORTPOS или SORTID, убрать с него primary key и будет счастье.

IMhO
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39634884
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WiskyЗначение ID прорежено, т.к. ожидалась потребность редко вставлять значения. Сверху падает новая версия словаря, которая сопоставляется с текущей по CODE. Надо обеспечить, что после обновления sort by ID и sort by VALUE будут совпадать, при этом нужно минимизировать количество замен ID, т.к. на них ссылается таблица с полмиллиардом записей.


Нененененене.
Правило №0. Первичный ключ не изменяется. Никогда не изменяется. Если изменяется, смотри Правило №0.

Правило №2. Первичный ключ не несёт в себе никакой информации, никакой смысловой нагрузки в предметной области, он служит только для одной цели -- идентификации записи.

Следствие №3. Первичный ключ имеет значение, которое уникально, но само это значение никому не интересно.


upd 24.04.2018 tchingiz


Правило № 4. Естественных первичных ключей не бывает.
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39634887
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПравило №2. Первичный ключ не несёт в себе никакой информации, никакой смысловой нагрузки в предметной области, он служит только для одной цели -- идентификации записи.Синтетический первичный ключ - да. Естественный - нет. Составной - всяко бывает...
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39634891
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaMasterZivПравило №2. Первичный ключ не несёт в себе никакой информации, никакой смысловой нагрузки в предметной области, он служит только для одной цели -- идентификации записи.Синтетический первичный ключ - да. Естественный - нет. Составной - всяко бывает...
ИМХО это в теории так, а в реальности только первое используется.

В остальном ТС честно сознался почему так
WiskyЗначение ID прорежено, т.к. ожидалась потребность редко вставлять значения. Сверху падает новая версия словаря, которая сопоставляется с текущей по CODE. Надо обеспечить, что после обновления sort by ID и sort by VALUE будут совпадать, при этом нужно минимизировать количество замен ID, т.к. на них ссылается таблица с полмиллиардом записей.
При проектировании перестарались с оптимизаторством, теперь пришло время наступить на эти грабли.
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39634911
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaСинтетический первичный ключ - да. Естественный - нет. Составной - всяко бывает...

Правило № 4. Естественных первичных ключей не бывает.
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39634990
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat FisherAkinaСинтетический первичный ключ - да. Естественный - нет. Составной - всяко бывает...

Правило № 4. Естественных первичных ключей не бывает.

Спасибо, я зобыл его добавить...
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39637151
Wisky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cane Cat FisherЕсть таблица словаря с тремя полями (ID, CODE, VALUE).
(16,123,АРБУЗ)
(32,123,БАНАН)
(48,123,ВИНОГРАД)
(64,123,ГРУША)
(80,123,ДЫНЯ)
Сверху падает новая версия словаря, которая сопоставляется с текущей по CODE.

Ошиблась, конечно CODE уникальный и неизменный.
Если так коробит от корректировки первичного ключа, CODE является PK, а ID уникальный с сортировкой совпадающей с Value
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39637159
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat FisherПравило № 4. Естественных первичных ключей не бывает.
СНИЛС. ИНН. ISBN. Номер страхового полиса. И т.д., и т.п. - примеров естественных первичных ключей дохрена.
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39637162
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wisky , лучше будет, если Вы (с учётом всего наговорённого выше) заново сформулируете задачу и снабдите её примером правильных исходных данных. А то не очень понятно, что в ней корректируется и как именно.
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39637163
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaCane Cat FisherПравило № 4. Естественных первичных ключей не бывает.
СНИЛС. ИНН. ISBN. Номер страхового полиса. И т.д., и т.п. - примеров естественных первичных ключей дохрена.
ИМХО лучше не рисковать.
Одному знакомому уже третий ИНН выдали. Налоговая что-то у себя накосячила, приходит он за возмещением НДФЛ по ипотеке, а ему - у вас ИНН другой, и так несколько раз )))
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39637165
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В топике звучала верная мысль о том что в качестве ПК лучше брать суррогат
На основе sequence. Все прочие способы нас приведут к аномалиям. Будут
Смены паспортов, ИНН, страховок.
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39637202
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИМХО лучше не рисковать.Нет тут никакого риска. Ты вообще не о том. ИНН идентифицирует именно налоговый счёт, а не человека. Так же, как и СНИЛС тоже идентифицирует страховой счёт. Ни то, ни другое, не дублируется. Я говорил о них к тому, что в таблице ИНН делать синтетический первичный индекс - неразумно. А вот на стороне привязки к человеку - да, возможно и дублирование. И человека (как правило) нужно идентифицировать (в рамках конкретной системы) по синтетическому ключу.
Dima TОдному знакомому уже третий ИНН выдали. Налоговая что-то у себя накосячила
У меня у самого 2 разных ИНН - один я получал сам, а второй они мне, как потом выяснилось, присвоили самостоятельно, когда создавали систему рассылки дорожного налога. Но как у меня из-за этого никаких проблем не возникает.
...
Рейтинг: 0 / 0
обновление ПЕРВИЧНОГО ключа
    #39637220
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ топике звучала верная мысль о том что в качестве ПК лучше брать суррогат
На основе sequence. Все прочие способы нас приведут к аномалиям. Будут
Смены паспортов, ИНН, страховок.

Joe Celko на тебя нет.
http://www.sql.ru/forum/507537/stil-programmirovaniya-dzho-selko-na-sql
...
Рейтинг: 0 / 0
25 сообщений из 55, страница 1 из 3
Форумы / Программирование [игнор отключен] [закрыт для гостей] / обновление ПЕРВИЧНОГО ключа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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