Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / increment vs недо sequence / 25 сообщений из 29, страница 1 из 2
01.08.2012, 10:17
    #37899973
.Anatoly.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
increment vs недо sequence
Работаю с системой, которая в качестве базы использует 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
01.08.2012, 10:35
    #37899997
vadiminfo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
increment vs недо sequence
.Anatoly. Может есть какие скрытые плюсы, о которых я не подозреваю?
Ну, возможно, больше возможностей в управлении значениями идентификатора.
Например, окажется через некоторое время, что нужно организовать равноправноую асинхронную репликацию. Инкремент может на двух сайтах сгенрить одно и то же значение. А последовательности вы может настроить на разную четность.
В общем , возможно, это более консервативный подход в плане рисков лишнего геммора на этапе сопровождения (за счет немного большего геммора на этапе разработки).
...
Рейтинг: 0 / 0
01.08.2012, 10:37
    #37899998
vadiminfo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
increment vs недо sequence
имелосьь в иду одно и тоже значение идентификатора для разных данных.
...
Рейтинг: 0 / 0
01.08.2012, 11:06
    #37900050
LSV
LSV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
increment vs недо sequence
vadiminfoИнкремент может на двух сайтах сгенрить одно и то же значение. А последовательности вы может настроить на разную четность.Что мешает настроить автоинкременты на заведома непересекающиеся интервалы ?
...
Рейтинг: 0 / 0
01.08.2012, 11:07
    #37900054
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
increment vs недо sequence
.Anatoly.Поэтому вопрос, чем мог быть обусловлен(оправдан) такой подход?Ничем.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.08.2012, 11:59
    #37901632
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
increment vs недо sequence
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
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / increment vs недо sequence / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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