Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
Пишу в этот раздел, т.к мне кажется эта проблема не столько привязана к БД, как к алгоритмированию. Сомневаюсь что моя проблема уникальна. Есть таблица словаря с тремя полями (ID, CODE, VALUE). При первоначальной инсталляции сортировка по ID и Value совпадает. (16,123,АРБУЗ) (32,123,БАНАН) (48,123,ВИНОГРАД) (64,123,ГРУША) (80,123,ДЫНЯ) Значение ID прорежено, т.к. ожидалась потребность редко вставлять значения. Сверху падает новая версия словаря, которая сопоставляется с текущей по CODE. Надо обеспечить, что после обновления sort by ID и sort by VALUE будут совпадать, при этом нужно минимизировать количество замен ID, т.к. на них ссылается таблица с полмиллиардом записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2018, 21:33 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
До чего я додумала: 1) определили список новых и обновляемых данных; 2) высчитали ID_L и ID_R текущего значения в старом словаре, если АРБУЗ переименовали в АНАНАС, то 16 попадает в диапазон 0-32, его трогать не надо, а если АРБУЗ переименовали в ВОДЯНАЯ ЯГОДА, то 16 не попадает в диапазон 48-64, следовательно надо переставлять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2018, 21:41 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
WiskyНадо обеспечитьНе надо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2018, 22:48 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
1) Сформировать откорректированную временную таблицу отсортированную по NAME 2) Определить наибольший непрерывный список записей (ВЕРНЫЙ БЛОК), там где сортировки по старому ID и новому NAME совпадают. Блок верных значений делит справочник на три части (НАЧАЛЬНЫЙ БЛОК)+(ВЕРНЫЙ БЛОК)+(КОНЕЧНЫЙ БЛОК) 3) Переставить (сменить ID) последнее значение НАЧАЛЬНОГО БЛОКА на верное место (в середину) 4) Проверить следующее значение на совпадение сортировок и двигаться к началу 5) повторять такую же процедуру для КОНЕЧНОГО БЛОКА 6) в случае если вставка невозможна (нет свободного ID) - критическая ошибка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2018, 23:34 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
Wiskyесли АРБУЗ переименовали в ВОДЯНАЯ ЯГОДА, то 16 не попадает в диапазон 48-64, следовательно надо переставлять.И следом перелопачивать полмиллиарда записей, чтобы заменить ссылку на справочник? Это не выглядит хорошей идеей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 00:09 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
Если это MSSQL то там на связях с нужной таблицей можно задать CASCADE UPDATE, но обязательно на всех связях таблицы. Тогда просто меняешь ID в исходной таблице, а дальше само поменяется. Но это самое плохое решение из всех возможных. По-хорошему ID менять не надо, т.к. на то он и абстрактный ключ чтобы не нести никакой смысловой нагрузки. Не надо в него вкладывать смысл "ID справочника из другого источника", надо просто добавить поле "ID справочника из другого источника" и в нем меняй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 07:21 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
Изменения 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 00:34 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
Изначальная задача у вас какая? Пока вопрос выглядит как "хочу левой ногой почесать правое ухо, до какой длины ногти стричь?" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 01:30 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 07:23 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
WiskyНо то что сортировка по ID совпадает с VALUE наверное удобно, если эта сортировка требуется постоянно, а VALUE длинное Если уж действительно встал вопрос производительности при сортировке по строке, и хочется заменить ее сортировкой по int, то можно добавить еще одно поле "ORDER_NUM" int, перезаполнять его по порядку каждый раз при изменении VALUE (раз уж это событие такое редкое), и использовать для сортировки. Хотя я почему-то сомневаюсь, что эта проблема с производительностью реальна. Меня терзают смутные сомнения. Скажите, а вы вообще ORDER BY используете? Или делаете запрос без ORDER BY, подметили, что порядок строк обычно соответствует ID, и теперь ради сохранения этого призрачного эффекта затеяли вот это все? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 13:02 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
Насколько я понимаю чужую задачу, у него динамически формируются различные группировки и при группировки по значению этого словаря он значительно теряет производительность. По поводу доп.поля выигрыша нет, проблема в вероятности масс.апдейта остаётся. Спасибо, что напомнили о перекрестной замене, наверное поставлю запрет на выдачу new используемых в old. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2018, 09:43 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
WiskyЕсть таблица словаря с тремя полями (ID, CODE, VALUE). (16,123,АРБУЗ) (32,123,БАНАН) (48,123,ВИНОГРАД) (64,123,ГРУША) (80,123,ДЫНЯ) Сверху падает новая версия словаря, которая сопоставляется с текущей по CODE. Только сейчас обратил внимание. А как новая версия сопоставляется по CODE, если CODE не уникальный - везде 123? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2018, 12:41 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
совершенно не ясно, с какого перепою ID это primary key. primary key должно быть или name (если оно уникально) или code (если оно уникально). ID переименовать в SORTPOS или SORTID, убрать с него primary key и будет счастье. IMhO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2018, 16:23 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
WiskyЗначение ID прорежено, т.к. ожидалась потребность редко вставлять значения. Сверху падает новая версия словаря, которая сопоставляется с текущей по CODE. Надо обеспечить, что после обновления sort by ID и sort by VALUE будут совпадать, при этом нужно минимизировать количество замен ID, т.к. на них ссылается таблица с полмиллиардом записей. Нененененене. Правило №0. Первичный ключ не изменяется. Никогда не изменяется. Если изменяется, смотри Правило №0. Правило №2. Первичный ключ не несёт в себе никакой информации, никакой смысловой нагрузки в предметной области, он служит только для одной цели -- идентификации записи. Следствие №3. Первичный ключ имеет значение, которое уникально, но само это значение никому не интересно. upd 24.04.2018 tchingiz Правило № 4. Естественных первичных ключей не бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2018, 16:36 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
MasterZivПравило №2. Первичный ключ не несёт в себе никакой информации, никакой смысловой нагрузки в предметной области, он служит только для одной цели -- идентификации записи.Синтетический первичный ключ - да. Естественный - нет. Составной - всяко бывает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2018, 16:38 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
AkinaMasterZivПравило №2. Первичный ключ не несёт в себе никакой информации, никакой смысловой нагрузки в предметной области, он служит только для одной цели -- идентификации записи.Синтетический первичный ключ - да. Естественный - нет. Составной - всяко бывает... ИМХО это в теории так, а в реальности только первое используется. В остальном ТС честно сознался почему так WiskyЗначение ID прорежено, т.к. ожидалась потребность редко вставлять значения. Сверху падает новая версия словаря, которая сопоставляется с текущей по CODE. Надо обеспечить, что после обновления sort by ID и sort by VALUE будут совпадать, при этом нужно минимизировать количество замен ID, т.к. на них ссылается таблица с полмиллиардом записей. При проектировании перестарались с оптимизаторством, теперь пришло время наступить на эти грабли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2018, 16:44 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
AkinaСинтетический первичный ключ - да. Естественный - нет. Составной - всяко бывает... Правило № 4. Естественных первичных ключей не бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2018, 17:07 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
Cane Cat FisherAkinaСинтетический первичный ключ - да. Естественный - нет. Составной - всяко бывает... Правило № 4. Естественных первичных ключей не бывает. Спасибо, я зобыл его добавить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2018, 19:33 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
Cane Cat FisherЕсть таблица словаря с тремя полями (ID, CODE, VALUE). (16,123,АРБУЗ) (32,123,БАНАН) (48,123,ВИНОГРАД) (64,123,ГРУША) (80,123,ДЫНЯ) Сверху падает новая версия словаря, которая сопоставляется с текущей по CODE. Ошиблась, конечно CODE уникальный и неизменный. Если так коробит от корректировки первичного ключа, CODE является PK, а ID уникальный с сортировкой совпадающей с Value ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 09:31 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
Cane Cat FisherПравило № 4. Естественных первичных ключей не бывает. СНИЛС. ИНН. ISBN. Номер страхового полиса. И т.д., и т.п. - примеров естественных первичных ключей дохрена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 09:43 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
Wisky , лучше будет, если Вы (с учётом всего наговорённого выше) заново сформулируете задачу и снабдите её примером правильных исходных данных. А то не очень понятно, что в ней корректируется и как именно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 09:45 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
AkinaCane Cat FisherПравило № 4. Естественных первичных ключей не бывает. СНИЛС. ИНН. ISBN. Номер страхового полиса. И т.д., и т.п. - примеров естественных первичных ключей дохрена. ИМХО лучше не рисковать. Одному знакомому уже третий ИНН выдали. Налоговая что-то у себя накосячила, приходит он за возмещением НДФЛ по ипотеке, а ему - у вас ИНН другой, и так несколько раз ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 09:52 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
В топике звучала верная мысль о том что в качестве ПК лучше брать суррогат На основе sequence. Все прочие способы нас приведут к аномалиям. Будут Смены паспортов, ИНН, страховок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 10:01 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
Dima TИМХО лучше не рисковать.Нет тут никакого риска. Ты вообще не о том. ИНН идентифицирует именно налоговый счёт, а не человека. Так же, как и СНИЛС тоже идентифицирует страховой счёт. Ни то, ни другое, не дублируется. Я говорил о них к тому, что в таблице ИНН делать синтетический первичный индекс - неразумно. А вот на стороне привязки к человеку - да, возможно и дублирование. И человека (как правило) нужно идентифицировать (в рамках конкретной системы) по синтетическому ключу. Dima TОдному знакомому уже третий ИНН выдали. Налоговая что-то у себя накосячила ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 10:42 |
|
||
|
обновление ПЕРВИЧНОГО ключа
|
|||
|---|---|---|---|
|
#18+
maytonВ топике звучала верная мысль о том что в качестве ПК лучше брать суррогат На основе sequence. Все прочие способы нас приведут к аномалиям. Будут Смены паспортов, ИНН, страховок. Joe Celko на тебя нет. http://www.sql.ru/forum/507537/stil-programmirovaniya-dzho-selko-na-sql ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 11:01 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39637220&tid=1340113]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
165ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 280ms |
| total: | 547ms |

| 0 / 0 |
