powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / increment vs недо sequence
25 сообщений из 29, страница 1 из 2
increment vs недо sequence
    #37899973
.Anatoly.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работаю с системой, которая в качестве базы использует MS SQL(в моем случае 2005). Для получения идентификаторов для новых записей(PRIMARY KEY) система вместе increment использует следующий прием.
Таблицу Keys с двумя столбцами: идентификатором таблицы и последним вставленным ключем.
Код: sql
1.
2.
3.
4.
CREATE TABLE [dbo].[Keys](
	[KEY_TABLE] [varchar](20) NOT NULL,
	[ID] [int] NOT NULL
) ON [PRIMARY]


А так же процедуру для извлечения нового значения
Код: sql
1.
exec [dbo].[GetNewKey] @strKeyTable='KEY_DISCOUNT',@nLastKey=@p2 output


Такой прием заставляет меня постоянно пользоваться курсорами, что доставляет массу хлопот.
Плюс насколько я понимаю, у sequence есть одно преимущество в плане проектирования. Сквозная нумерация для нескольких таблиц, но здесь такой подход не используется.

Поэтому вопрос, чем мог быть обусловлен(оправдан) такой подход? Может есть какие скрытые плюсы, о которых я не подозреваю? А какие достоинства есть у настоящего sequence в MS SQL 2012?
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37899997
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Anatoly. Может есть какие скрытые плюсы, о которых я не подозреваю?
Ну, возможно, больше возможностей в управлении значениями идентификатора.
Например, окажется через некоторое время, что нужно организовать равноправноую асинхронную репликацию. Инкремент может на двух сайтах сгенрить одно и то же значение. А последовательности вы может настроить на разную четность.
В общем , возможно, это более консервативный подход в плане рисков лишнего геммора на этапе сопровождения (за счет немного большего геммора на этапе разработки).
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37899998
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имелосьь в иду одно и тоже значение идентификатора для разных данных.
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900050
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoИнкремент может на двух сайтах сгенрить одно и то же значение. А последовательности вы может настроить на разную четность.Что мешает настроить автоинкременты на заведома непересекающиеся интервалы ?
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900054
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Anatoly.Поэтому вопрос, чем мог быть обусловлен(оправдан) такой подход?Ничем.

ИМХО сделали по привычке - опытного сиквелиста не было, подсказать некому было.
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900105
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVЧто мешает настроить автоинкременты на заведома непересекающиеся интервалы ?
Ну, заведомость непересекаемости интервалов трбует, возможно, больших усилий, и риски пересечения остаются. Нечетные то сто пудово не пересуктся, а думать не надо совсем.
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900149
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, они в ходе экплуатации возьми да экспортни послениние с первого на второй. Вот и попали в другй интервал на втором.
А четность управляется. Такое может быть заложено в коде: если увидит не ту четность ее изменит.
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900238
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Anatoly.Поэтому вопрос, чем мог быть обусловлен(оправдан) такой подход?

Варианты:
1. Тянется с версий системы, где в БД с SEQ были напряжёнки:
- не было SEQ,
- недостаточная функциональность SEQ
- не устраивала производительность SEQ.
2. Планировали использовать не только MS SQL в качестве СУБД, а в других СУБД могут быть напряжёнки SEQ из п.1.
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900319
.Anatoly.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo.Anatoly. Может есть какие скрытые плюсы, о которых я не подозреваю?
Ну, возможно, больше возможностей в управлении значениями идентификатора.
Например, окажется через некоторое время, что нужно организовать равноправноую асинхронную репликацию. Инкремент может на двух сайтах сгенрить одно и то же значение. А последовательности вы может настроить на разную четность.
В общем , возможно, это более консервативный подход в плане рисков лишнего геммора на этапе сопровождения (за счет немного большего геммора на этапе разработки).

Вы описали интересный случай. А есть другое(более оптимальное) решение для него, кроме приведенного выше?
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900328
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Anatoly.А есть другое(более оптимальное) решение для него, кроме приведенного
выше?
Использование UUID - рулит!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900364
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Anatoly.Вы описали интересный случай. А есть другое(более оптимальное) решение для него, кроме приведенного выше?
Я особо не искал, поскоку это устроило. У меня Оракл, а там по любасу только последовательности.
Но это просто пример, который означет, что в принципе риски могут, что последовательность может быть попроще на стадии сопровождении, поскоку позволят более гибко управлять формированием значений суррогатного идентификатора.
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900396
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глобальные идентификаторы всеже не очень хорошо визуально воспринимаются, поэтому отпугивают.
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900423
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoГлобальные идентификаторы всеже не очень хорошо визуально воспринимаются,
поэтому отпугивают.
Какой идиот станет показывать пользователю суррогатные ключи?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900442
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКакой идиот станет показывать пользователю суррогатные ключи?..

Кроме конечного пользователя есть есче разработчики, админы. При анализе данных, например, на предмет ошибок значения суррогатов ингода могут просмотриваться.
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900451
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoГлобальные идентификаторы всеже не очень хорошо визуально воспринимаются, поэтому отпугивают.
Не только визуально. В смысле использования order by <identity> - это простой способ показать данные в порядке создания записей.
А по поводу "организовать равноправную асинхронную репликацию" - именно так и делается, когда платформы разные, где-то guid-а нет, где-то sequence-ов. А такое решение будет работать на любом серваке из взрослых СУБД довольно старых версий.
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900460
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Васкецовплатформы разные, где-то guid-а нет

В этом случае он генерится на клиенте перед вставкой. Впрочем, это чаще всего удобно
делать даже есть в СУБД есть встроенный генератор uuid-ов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900745
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Anatoly.vadiminfoпропущено...

Ну, возможно, больше возможностей в управлении значениями идентификатора.
Например, окажется через некоторое время, что нужно организовать равноправноую асинхронную репликацию. Инкремент может на двух сайтах сгенрить одно и то же значение. А последовательности вы может настроить на разную четность.
В общем , возможно, это более консервативный подход в плане рисков лишнего геммора на этапе сопровождения (за счет немного большего геммора на этапе разработки).

Вы описали интересный случай. А есть другое(более оптимальное) решение для него, кроме приведенного выше?Оптимально - инкремент с разделением диапазонов или GUID
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900827
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Anatoly.Поэтому вопрос, чем мог быть обусловлен(оправдан) такой подход?
Такой подход даже в "версионном" Oracle всегда расценивался как bad design по соображениям масштабируемости. Крайне сомневаюсь, что для MSSQL найдутся соображения, которые делают его разумным. Здесь это когда-то обсуждали, и пришли к выводу, что в MS если по каким-то причинам не хватает функциональности identity, следует делать нетранзакционную внешнюю хранимку, генерирующую эти ключи.
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900868
Фотография Infernal V. Raven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКакой идиот станет показывать пользователю суррогатные ключи?..
Вообще промышленные системы обычно показывают, например Оракловые.
А что такого? Ну увидит пользователь уникальный ключ, испугается и убежит?
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900917
mike.nsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
.Anatoly.,

Такой подход (получение первичного ключа через select и update записи в таблице Keys) ошибочен на любых СУБД, т.к.:
1) версионник (если явно не наложить блокировку на изменяемую запись) может в случае одновременного обращения двух пользователей за ключами выдать им одинаковый ключ, и одна из транзакций срубится при последующей вставке этого ключа в таблицу;
2) блокировочник заблокирует измененную запись в таблице Keys до завершения транзакции, а остальные желающие добавить запись в ту же таблицу @strKeyTable будут тупо ждать этого завершения. В результате при достаточном количестве пользователей наступают тормоза и дедлоки.

Для получения первичных ключей должны использоваться нетранзакционные механизмы (uuid, identity, sequence).
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900937
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mike.nsk.Anatoly.,

Такой подход (получение первичного ключа через select и update записи в таблице Keys) ошибочен на любых СУБД, т.к.:
1) версионник (если явно не наложить блокировку на изменяемую запись) может в случае одновременного обращения двух пользователей за ключами выдать им одинаковый ключ, и одна из транзакций срубится при последующей вставке этого ключа в таблицу;
2) блокировочник заблокирует измененную запись в таблице Keys до завершения транзакции , а остальные желающие добавить запись в ту же таблицу @strKeyTable будут тупо ждать этого завершения. В результате при достаточном количестве пользователей наступают тормоза и дедлоки.

Для получения первичных ключей должны использоваться нетранзакционные механизмы (uuid, identity, sequence).

Не на 100% так. На Informix можно сделать "нелогируемую" таблицу - свойства транзакции на изменения именно в этой таблице не будут распространяться. Будет чаще проявляться эффект "дыр" в последовательности (при откатах транзакций) - но в SEQ этот эффект такой же...
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37900959
mike.nsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АнатоЛой
Не на 100% так. На Informix можно сделать "нелогируемую" таблицу - свойства транзакции на изменения именно в этой таблице не будут распространяться. Будет чаще проявляться эффект "дыр" в последовательности (при откатах транзакций) - но в SEQ этот эффект такой же...

Ну стало быть это и есть разновидность нетранзакционного механизма.
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37901452
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Поэтому вопрос, чем мог быть обусловлен(оправдан) такой подход? Может есть какие
> скрытые плюсы, о которых я не подозреваю? А какие достоинства есть у настоящего
> sequence в MS SQL 2012?

Прежде всего недостаток этого и достоинство identity в том, что identity не
использует транзакционные механизмы, т.е. это быстро и дополнительно
никому не мешает (нет взаимных блокировок на получении следующего
идентификатора). А это решение наоборот блокирует эту твою таблицу (возможно,
только одну запись в ней, возможно, страницу, а возможно и всю таблицу целиком)
на период ВСЕЙ транзакции, избежать этого нельзя, и вынести получение нового
ID за пределы транзакции тоже нельзя.

Достоинства у такого метода --
-- контролируемость со стороны разработчика
-- переносимость между разными СУБД.
-- транзакционность. ACID гарантируется. Т.е. если что-то выделилось --
останется на века, а выделилось, и потом транзакция отменилась -- отменится
и выделение нового идентификатора. (identity наоборот например нетранзакционна).

Суммарно применять такой способ может быть нужно для генерации каки-то
идентификаторов из предметной области, доступных для чтения пользователю,
но для внутренних идентификаторов это -- смерть производительности
(если она конечно важна).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37901468
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 08/01/2012 07:37 PM, mike.nsk wrote:

> 1) версионник (если явно не наложить блокировку на изменяемую запись) может в
> случае одновременного обращения двух пользователей за ключами выдать им
> одинаковый ключ, и одна из транзакций срубится при последующей вставке этого
> ключа в таблицу;

Не пугай людей, не может.


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
increment vs недо sequence
    #37901632
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 08/01/2012 07:37 PM, mike.nsk wrote:

> 1) версионник (если явно не наложить блокировку на изменяемую запись) может в
> случае одновременного обращения двух пользователей за ключами выдать им
> одинаковый ключ, и одна из транзакций срубится при последующей вставке этого
> ключа в таблицу;

Не пугай людей, не может.
Смотря как сделать. Майк, полагаю, имеет в виду вариант наподобие

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create function next_id(p_table_name varchar2) return integer as
begin
  for cr in (select * from sequences where table_name = p_table_name) loop
    update sequences set value = value + 1 where current of cr;
    return cr.value;
  end loop;
  insert into sequences values (p_table_name, 2);
  return 1;
end;
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / increment vs недо sequence
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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