powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Sub-identity как лучше организовать?
14 сообщений из 14, страница 1 из 1
Sub-identity как лучше организовать?
    #38683962
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Вопрос, который при всей тривиальности поставил в тупик.
Задача: есть таблица. с определенным Unique Key.
Необходимо контролировать версионность записей в данной таблице.
(т.е. изменения/добавления/удаления) сохранять в архиве.

И маленькое, но главное, условие - каждое изменение записи инкрементит версию записи на 1.

Вопрос - как организовать данный инкремент?
Понятно, что тривиальные путь - выбрать максимальную версию из архива = сделать + 1.
Либо хранить в самой записи ее текущую версию и инкрементить на 1.

НО! Может быть есть какие-то более изящные решения?
Может быть есть СУБД, в которых реализован sub-identity (т.е. инкрементность в пределах уникального ключа?)
...
Рейтинг: 0 / 0
Sub-identity как лучше организовать?
    #38684021
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть у вас есть таблица myTable c ключом на поле id
Код: sql
1.
create table myTable (id int primary key, somedata)


у вас есть другая таблица myTableVersions
Код: sql
1.
create table myTableVersions(ver_id int not null, id int not null references myTable)

Так?

Теперь вы хотите чтобы например для записи с id = 123 ver_id были 1,2,3,4 ... Так?
А почему не сделать ver_id identity? Пускай будет уникальным не в пределах id, а в пределах таблицы?

Mikle83 И маленькое, но главное, условие - каждое изменение записи инкрементит версию записи на 1. Небось еще и без дырок?

Mikle83 Понятно, что тривиальные путь - выбрать максимальную версию из архива = сделать + 1.В пределах serializable транзакции.
...
Рейтинг: 0 / 0
Sub-identity как лучше организовать?
    #38684044
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERG1257Теперь вы хотите чтобы например для записи с id = 123 ver_id были 1,2,3,4 ... Так?
А почему не сделать ver_id identity? Пускай будет уникальным не в пределах id, а в пределах таблицы?
Mikle83 И маленькое, но главное, условие - каждое изменение записи инкрементит версию записи на 1. Небось еще и без дырок?

Может быть не совсем верный подход с точки зрения БД, но хранение версий облегчает жизнь пользователям: появляется возможность оперировать понятием "3-я версия документа"/"внесены изменения в 8 версию и т.д.".

При этом пользователи привыкают, что действительно инкремент непрерывный и ожидают увидеть после пятой - шестую версию.
И понимать, как изменялся документ от версии к версии (видя всю историю). И при этом версии никак не могут поменяться - они "жестко" привязаны к конкретной иттерации.

Можно, конечно же подобный функционал вынести на клиента, но уже с жесткой привязкой проблемы.
...
Рейтинг: 0 / 0
Sub-identity как лучше организовать?
    #38684068
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Формируйте номер версии динамически как row_number отсортировав на клиенте по ver_id или по change_datetime.
Тогда все будет аккуратно, без дырок при любых пертурбациях.
...
Рейтинг: 0 / 0
Sub-identity как лучше организовать?
    #38684075
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERG1257,

ТС, как понимаю, как раз хочет чтобы восьмая версия оставалась восьмой независимо от того, существует ли еще седьмая или нет.
...
Рейтинг: 0 / 0
Sub-identity как лучше организовать?
    #38684080
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83Может быть не совсем верный подход с точки зрения БД, но хранение версий
облегчает жизнь пользователям: появляется возможность оперировать понятием "3-я версия
документа"/"внесены изменения в 8 версию и т.д.".
Тогда ни к чему выносить старые версии в отдельную таблицу. При редактировании документа
он сохраняется с новым номером версии. Вопросом становится как (не дать) редактировать
старые версии этого документа (чтобы они не начали отличаться от своих напечатанных
вариантов). Значит нужно поле-флаг "это несвежая версия, редактировать нельзя".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Sub-identity как лучше организовать?
    #38684135
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83, поле с номером версии добавляете как в основную таблицу, так и в таблицу версий. У таблицы версий свой уникальный ключ. У таблицы версий альтернативный ключ на 2 поля: ключ основной таблицы и номер версии. Последовательность действий при сохранении новой версии:
1. Добавляем запись в таблицу версий. Получаем current_ver_id
2. Обновляем номер версии в добавленной записи как count(*)+1 where ver_id < current_ver_id and id=current_id
3. Обновляем номер версии в основной таблице
...
Рейтинг: 0 / 0
Sub-identity как лучше организовать?
    #38684143
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛойполе с номером версии добавляете как в основную таблицу, так и в таблицу
версий. У таблицы версий свой уникальный ключ. У таблицы версий альтернативный ключ на 2
поля: ключ основной таблицы и номер версии.
А теперь представляем весь геморрой с собиранием несвежей версии документа, имеющего
детализацию и прочие связи M:N, содрогаемся, и смываем весь этот топик в унитаз.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Sub-identity как лучше организовать?
    #38684432
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovАнатоЛойполе с номером версии добавляете как в основную таблицу, так и в таблицу
версий. У таблицы версий свой уникальный ключ. У таблицы версий альтернативный ключ на 2
поля: ключ основной таблицы и номер версии.
А теперь представляем весь геморрой с собиранием несвежей версии документа, имеющего
детализацию и прочие связи M:N, содрогаемся, и смываем весь этот топик в унитаз.

Что больший геморрой: "собирание несвежей версии" или "балласт несвежих версий во всех запросах при 99% работе только со свежими" - решать топикстартеру.
...
Рейтинг: 0 / 0
Sub-identity как лучше организовать?
    #38684477
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинSERG1257,
ТС, как понимаю, как раз хочет чтобы восьмая версия оставалась восьмой независимо от того, существует ли еще седьмая или нет.


Да, именно так, поэтому и отписал в посте №3 - что нумерование на стороне клиента не совсем устраивает.


АнатоЛойMikle83, поле с номером версии добавляете как в основную таблицу, так и в таблицу версий. У таблицы версий свой уникальный ключ. У таблицы версий альтернативный ключ на 2 поля: ключ основной таблицы и номер версии. Последовательность действий при сохранении новой версии:
1. Добавляем запись в таблицу версий. Получаем current_ver_id
2. Обновляем номер версии в добавленной записи как count(*)+1 where ver_id < current_ver_id and id=current_id
3. Обновляем номер версии в основной таблице

Это-то понятно, так и сделано сейчас (см первый пост в теме), но было желание осмотреться по СУБД = может есть в каких-то штатные средства, т.к. в ручную "прорисовывать" для каждой таблицы такое обновление - не айс,
а "городить" универсальный сабидентити - оно конечно же можно (и, в принципе, к этому сейчас и пришел), но ИМХО странно, что СУБД не дают готового интерфейса.
...
Рейтинг: 0 / 0
Sub-identity как лучше организовать?
    #38684868
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83было желание осмотреться по СУБД = может есть в каких-то штатные средства, т.к. в ручную "прорисовывать" для каждой таблицы такое обновление - не айс,
а "городить" универсальный сабидентити - оно конечно же можно (и, в принципе, к этому сейчас и пришел), но ИМХО странно, что СУБД не дают готового интерфейса.
Имхо, некоторые СУБД не так давно обзавелись собственно identity, чего уж там про "Sub-identity" говорить :).
Identity есть функция с одним результатом от словаря метаданных (названия таблицы) и предыдущего результата вызова этой же функции. Понятна реализация "из ядра" СУБД.

Твой Sub-identity есть функция от данных (значений в записях таблицы) и предыдущего вызова функции для этой же записи.
Как ты себе это представляешь в виде реализации "из ядра"?
...
Рейтинг: 0 / 0
Sub-identity как лучше организовать?
    #38685823
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛойТвой Sub-identity есть функция от данных (значений в записях таблицы) и предыдущего вызова функции для этой же записи.
Как ты себе это представляешь в виде реализации "из ядра"?

Я не представляю себе механику "ядра", но если есть уникальный ключ на таблице, то что мешает сделать аналог .
[quot]с одним результатом от словаря метаданных (названия таблицы) и предыдущего результата вызова этой же функции[quot]
только не от названия таблицы, а от каждого значения данного индекса?
...
Рейтинг: 0 / 0
Sub-identity как лучше организовать?
    #38686084
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 30.06.2014 18:08, Mikle83 wrote:


> И маленькое, но главное, условие - каждое изменение записи инкрементит
> версию записи на 1.
>
> Вопрос - как организовать данный инкремент?
> Понятно, что тривиальные путь - выбрать максимальную версию из архива =
> сделать + 1.
> Либо хранить в самой записи ее текущую версию и инкрементить на 1.


Ну и чем же тебя ЭТИ два варианта реализации не устраивают ?

На самом деле если делать, то в PK записи будут два поля, ID записи и
номер версии. Поэтому не понятно, зачем тебе ещё что-то искать.
Но если очень нужно, то можно и поискать. Поскольку в PK будут два поля,
ID записи и номер версии, то по ID записи ты очень эффективно найдёшь её
последнюю версию.

Так что не понятно, в чём проблема.

> НО! Может быть есть какие-то более изящные решения?
> Может быть есть СУБД, в которых реализован sub-identity (т.е.
> инкрементность в пределах уникального ключа?)

Это был бы идиотизм...

Да и по-любому, это функционал приложения, особенность предметной
области, поэтому СУБД это не должна реализовывать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Sub-identity как лучше организовать?
    #38686091
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 02.07.2014 15:43, Mikle83 wrote:

> Я не представляю себе механику "ядра", но если есть уникальный ключ на
> таблице, то что мешает сделать аналог .

мешают проблемы производительности.

identity -- один счётчик в памяти, который тикает и выдаёт следующее
число. Количество identity в памяти -- столько , сколько таблиц с
identity, ну 100 или 1000. Это можно себе позволить.

А сколько будет таких счётчиков, если их делать на каждую логическую
запись в таблице ? Миллионы или десятки миллионов. Это уже затратно по
памяти.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Sub-identity как лучше организовать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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