|
|
|
Sub-identity как лучше организовать?
|
|||
|---|---|---|---|
|
#18+
Добрый день! Вопрос, который при всей тривиальности поставил в тупик. Задача: есть таблица. с определенным Unique Key. Необходимо контролировать версионность записей в данной таблице. (т.е. изменения/добавления/удаления) сохранять в архиве. И маленькое, но главное, условие - каждое изменение записи инкрементит версию записи на 1. Вопрос - как организовать данный инкремент? Понятно, что тривиальные путь - выбрать максимальную версию из архива = сделать + 1. Либо хранить в самой записи ее текущую версию и инкрементить на 1. НО! Может быть есть какие-то более изящные решения? Может быть есть СУБД, в которых реализован sub-identity (т.е. инкрементность в пределах уникального ключа?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 17:08 |
|
||
|
Sub-identity как лучше организовать?
|
|||
|---|---|---|---|
|
#18+
То есть у вас есть таблица myTable c ключом на поле id Код: sql 1. у вас есть другая таблица myTableVersions Код: sql 1. Так? Теперь вы хотите чтобы например для записи с id = 123 ver_id были 1,2,3,4 ... Так? А почему не сделать ver_id identity? Пускай будет уникальным не в пределах id, а в пределах таблицы? Mikle83 И маленькое, но главное, условие - каждое изменение записи инкрементит версию записи на 1. Небось еще и без дырок? Mikle83 Понятно, что тривиальные путь - выбрать максимальную версию из архива = сделать + 1.В пределах serializable транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 17:55 |
|
||
|
Sub-identity как лучше организовать?
|
|||
|---|---|---|---|
|
#18+
SERG1257Теперь вы хотите чтобы например для записи с id = 123 ver_id были 1,2,3,4 ... Так? А почему не сделать ver_id identity? Пускай будет уникальным не в пределах id, а в пределах таблицы? Mikle83 И маленькое, но главное, условие - каждое изменение записи инкрементит версию записи на 1. Небось еще и без дырок? Может быть не совсем верный подход с точки зрения БД, но хранение версий облегчает жизнь пользователям: появляется возможность оперировать понятием "3-я версия документа"/"внесены изменения в 8 версию и т.д.". При этом пользователи привыкают, что действительно инкремент непрерывный и ожидают увидеть после пятой - шестую версию. И понимать, как изменялся документ от версии к версии (видя всю историю). И при этом версии никак не могут поменяться - они "жестко" привязаны к конкретной иттерации. Можно, конечно же подобный функционал вынести на клиента, но уже с жесткой привязкой проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 18:07 |
|
||
|
Sub-identity как лучше организовать?
|
|||
|---|---|---|---|
|
#18+
Формируйте номер версии динамически как row_number отсортировав на клиенте по ver_id или по change_datetime. Тогда все будет аккуратно, без дырок при любых пертурбациях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 18:28 |
|
||
|
Sub-identity как лучше организовать?
|
|||
|---|---|---|---|
|
#18+
SERG1257, ТС, как понимаю, как раз хочет чтобы восьмая версия оставалась восьмой независимо от того, существует ли еще седьмая или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 18:37 |
|
||
|
Sub-identity как лучше организовать?
|
|||
|---|---|---|---|
|
#18+
Mikle83Может быть не совсем верный подход с точки зрения БД, но хранение версий облегчает жизнь пользователям: появляется возможность оперировать понятием "3-я версия документа"/"внесены изменения в 8 версию и т.д.". Тогда ни к чему выносить старые версии в отдельную таблицу. При редактировании документа он сохраняется с новым номером версии. Вопросом становится как (не дать) редактировать старые версии этого документа (чтобы они не начали отличаться от своих напечатанных вариантов). Значит нужно поле-флаг "это несвежая версия, редактировать нельзя". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 18:43 |
|
||
|
Sub-identity как лучше организовать?
|
|||
|---|---|---|---|
|
#18+
Mikle83, поле с номером версии добавляете как в основную таблицу, так и в таблицу версий. У таблицы версий свой уникальный ключ. У таблицы версий альтернативный ключ на 2 поля: ключ основной таблицы и номер версии. Последовательность действий при сохранении новой версии: 1. Добавляем запись в таблицу версий. Получаем current_ver_id 2. Обновляем номер версии в добавленной записи как count(*)+1 where ver_id < current_ver_id and id=current_id 3. Обновляем номер версии в основной таблице ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 19:43 |
|
||
|
Sub-identity как лучше организовать?
|
|||
|---|---|---|---|
|
#18+
АнатоЛойполе с номером версии добавляете как в основную таблицу, так и в таблицу версий. У таблицы версий свой уникальный ключ. У таблицы версий альтернативный ключ на 2 поля: ключ основной таблицы и номер версии. А теперь представляем весь геморрой с собиранием несвежей версии документа, имеющего детализацию и прочие связи M:N, содрогаемся, и смываем весь этот топик в унитаз. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 20:05 |
|
||
|
Sub-identity как лучше организовать?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovАнатоЛойполе с номером версии добавляете как в основную таблицу, так и в таблицу версий. У таблицы версий свой уникальный ключ. У таблицы версий альтернативный ключ на 2 поля: ключ основной таблицы и номер версии. А теперь представляем весь геморрой с собиранием несвежей версии документа, имеющего детализацию и прочие связи M:N, содрогаемся, и смываем весь этот топик в унитаз. Что больший геморрой: "собирание несвежей версии" или "балласт несвежих версий во всех запросах при 99% работе только со свежими" - решать топикстартеру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2014, 10:15 |
|
||
|
Sub-identity как лучше организовать?
|
|||
|---|---|---|---|
|
#18+
Кот МатроскинSERG1257, ТС, как понимаю, как раз хочет чтобы восьмая версия оставалась восьмой независимо от того, существует ли еще седьмая или нет. Да, именно так, поэтому и отписал в посте №3 - что нумерование на стороне клиента не совсем устраивает. АнатоЛойMikle83, поле с номером версии добавляете как в основную таблицу, так и в таблицу версий. У таблицы версий свой уникальный ключ. У таблицы версий альтернативный ключ на 2 поля: ключ основной таблицы и номер версии. Последовательность действий при сохранении новой версии: 1. Добавляем запись в таблицу версий. Получаем current_ver_id 2. Обновляем номер версии в добавленной записи как count(*)+1 where ver_id < current_ver_id and id=current_id 3. Обновляем номер версии в основной таблице Это-то понятно, так и сделано сейчас (см первый пост в теме), но было желание осмотреться по СУБД = может есть в каких-то штатные средства, т.к. в ручную "прорисовывать" для каждой таблицы такое обновление - не айс, а "городить" универсальный сабидентити - оно конечно же можно (и, в принципе, к этому сейчас и пришел), но ИМХО странно, что СУБД не дают готового интерфейса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2014, 10:56 |
|
||
|
Sub-identity как лучше организовать?
|
|||
|---|---|---|---|
|
#18+
Mikle83было желание осмотреться по СУБД = может есть в каких-то штатные средства, т.к. в ручную "прорисовывать" для каждой таблицы такое обновление - не айс, а "городить" универсальный сабидентити - оно конечно же можно (и, в принципе, к этому сейчас и пришел), но ИМХО странно, что СУБД не дают готового интерфейса. Имхо, некоторые СУБД не так давно обзавелись собственно identity, чего уж там про "Sub-identity" говорить :). Identity есть функция с одним результатом от словаря метаданных (названия таблицы) и предыдущего результата вызова этой же функции. Понятна реализация "из ядра" СУБД. Твой Sub-identity есть функция от данных (значений в записях таблицы) и предыдущего вызова функции для этой же записи. Как ты себе это представляешь в виде реализации "из ядра"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2014, 15:31 |
|
||
|
Sub-identity как лучше организовать?
|
|||
|---|---|---|---|
|
#18+
АнатоЛойТвой Sub-identity есть функция от данных (значений в записях таблицы) и предыдущего вызова функции для этой же записи. Как ты себе это представляешь в виде реализации "из ядра"? Я не представляю себе механику "ядра", но если есть уникальный ключ на таблице, то что мешает сделать аналог . [quot]с одним результатом от словаря метаданных (названия таблицы) и предыдущего результата вызова этой же функции[quot] только не от названия таблицы, а от каждого значения данного индекса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 14:43 |
|
||
|
Sub-identity как лучше организовать?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 18:07 |
|
||
|
Sub-identity как лучше организовать?
|
|||
|---|---|---|---|
|
#18+
On 02.07.2014 15:43, Mikle83 wrote: > Я не представляю себе механику "ядра", но если есть уникальный ключ на > таблице, то что мешает сделать аналог . мешают проблемы производительности. identity -- один счётчик в памяти, который тикает и выдаёт следующее число. Количество identity в памяти -- столько , сколько таблиц с identity, ну 100 или 1000. Это можно себе позволить. А сколько будет таких счётчиков, если их делать на каждую логическую запись в таблице ? Миллионы или десятки миллионов. Это уже затратно по памяти. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 18:12 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=28&tid=1540854]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 370ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...