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

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
22.05.2016, 07:43
|
|||
|---|---|---|---|
|
|||
Последовательная нумерация в пределах группы записей |
|||
|
#18+
У меня есть таблица примерно вот такого вида: Код: plaintext 1. 2. 3. Поле Номер должно быть уникально и заполняться автоматически (требования бизнеса). Алгоритм заполнения: Организация + Подразделение + Отдел + Группа + [Очередной порядковый номер в пределах четырех предыдущих полей]. Табличка будет большая - основная таблица в БД, миллионы записей. Пользователей много, 99% из них работают с этой таблицей. 80% чтений. Как лучше решить такую задачу? Делать Код: plaintext 1. даже при наличии индексов по этим полям мне кажется не очень удачной идеей. Autoincremented поля и SEQUENCE здесь не подходят в силу того, что нумерация не сквозная, а рамках группы записей. Пока думаю над вариантом создания еще одной таблицы, в которой будет храниться следующей номер, который должен быть выделен в пределах выбранной группы полей: Код: plaintext 1. 2. 3. Соответвенно при вставке записи в основную таблицу в триггере получать значение [Следующий номер], использовать его в основной таблице, а потом увеличивать значение в вспомогательной таблице. Может есть решения лучше ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.05.2016, 07:47
|
|||
|---|---|---|---|
|
|||
Последовательная нумерация в пределах группы записей |
|||
|
#18+
Да, забыл добавить - сгенерированный номер не должен меняться для записи. Это номер, который пойдет в бумажные документы и по нему потом будет искаться запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.05.2016, 11:16
|
|||
|---|---|---|---|
Последовательная нумерация в пределах группы записей |
|||
|
#18+
expl0rerМожет есть решения лучше ?Посмотрите Организация пользовательских счетчиков (генераторов) в Microsoft SQL Server , оно уже стало классикой :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.05.2016, 12:07
|
|||
|---|---|---|---|
|
|||
Последовательная нумерация в пределах группы записей |
|||
|
#18+
Да, спасибо - похоже то, что нужно. Я правильно понял, что на основную таблицу мне нужно повесить триггер на вставку. В этом триггере я буду проверять если у меня уже в таблице счетчиков счетчик с нужной комбинацией ключевых полей. Если нет - создавать его. А триггер повешенный на таблицу счетчиков будет создавать SEQUENCE и функции для работы с ней? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.05.2016, 12:35
|
|||
|---|---|---|---|
Последовательная нумерация в пределах группы записей |
|||
|
#18+
alexeyvgоно уже стало классикой :-)Классика - когда не нужна транзакционность при генерации. ТС'у же наоборот, транзакционность генерации нужна. expl0rer Код: plaintext 1. Запрос должен выглядеть так: Код: sql 1. и быть в одной транзакции со вставкой в таблицу. Если потребуется одновременная генерации по нескольким сочетаниям (Организация, Подразделение, Отдел, Группа), запрос и индекс придется доработать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.05.2016, 12:56
|
|||
|---|---|---|---|
|
|||
Последовательная нумерация в пределах группы записей |
|||
|
#18+
invmКлассика - когда не нужна транзакционность при генерации. А в чем именно нарушается транзакционность в предложенном решении? Точнее, какие именно следствия в моему случае вследствие нарушения транзакционности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.05.2016, 14:31
|
|||
|---|---|---|---|
Последовательная нумерация в пределах группы записей |
|||
|
#18+
expl0rerТочнее, какие именно следствия в моему случае вследствие нарушения транзакционности?К нарушению непрерывности номеров. Это лечится отключением "автономности" генерации в этом решении. Но даже если так сделать - это не особо поможет. Вам, по сути, требуется множество генераторов на одну таблицу. А такого там не предусмотрено. Следовательно, придется дорабатывать под свои нужды. Как по мне, для вашего конкретного случая гораздо проще и эффективнее сделать примерно так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.05.2016, 18:49
|
|||
|---|---|---|---|
Последовательная нумерация в пределах группы записей |
|||
|
#18+
invmТС'у же наоборот, транзакционность генерации нужна.Ну, вообще он про это не писал. Если транзакционность нужна, что можно использовать ту схему, про которую ТС писал, в чём проблема? expl0rerПока думаю над вариантом создания еще одной таблицы, в которой будет храниться следующей номер, который должен быть выделен в пределах выбранной группы полей: Впрочем, можно использовать и MAX.... invmВам, по сути, требуется множество генераторов на одну таблицу. А такого там не предусмотрено. Следовательно, придется дорабатывать под свои нужды.Там просто пример реализации автономной транзакции. Собственно, там используется та же отдельная таблица счётчиков, как у ТС, но с обращением в отдельной транзакции. Дмитрий Костылев в докладах иллюстрировал этот код как раз такими сложными случаями, как у ТС, типа отдельная нумерация для периодов, для подразделений, для "групп по 1000", для клиентов, и прочими причудливыми потребностями бизнес-пользователей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.05.2016, 20:03
|
|||
|---|---|---|---|
Последовательная нумерация в пределах группы записей |
|||
|
#18+
alexeyvgНу, вообще он про это не писал."Очередной порядковый номер в пределах четырех предыдущих полей" как бы намекает на непрерывность. По крайней мере, я понял именно так. alexeyvgТам просто пример реализации автономной транзакции. Собственно, там используется та же отдельная таблица счётчиков, как у ТС, но с обращением в отдельной транзакции. Дмитрий Костылев в докладах иллюстрировал этот код как раз такими сложными случаями, как у ТС, типа отдельная нумерация для периодов, для подразделений, для "групп по 1000", для клиентов, и прочими причудливыми потребностями бизнес-пользователей.Вот именно. Принцип один - либо доп. таблица, либо на основе основной. А весь огород с CLR необходим если нужны "автономные" транзакции или возможность получать номера функцией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.05.2016, 20:39
|
|||
|---|---|---|---|
|
|||
Последовательная нумерация в пределах группы записей |
|||
|
#18+
Прошу прощения, что сразу не написал. В таком виде транзакционность мне не нужна - пропуски могут быть, главное чтобы их было не очень много. Автоинкрементируемое поле не устраивает клиента своим размером - им нужен короткий 3-4 символьный номер. Если нумеровать в пределах Организация+Подразделение+Отдел+Группа - так и выходит. А если некоторые номера будут пропущены, не страшно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.05.2016, 20:54
|
|||
|---|---|---|---|
Последовательная нумерация в пределах группы записей |
|||
|
#18+
expl0rer, Варианты вам были предложены. Даже с примером. Но выбрать вы должны самостоятельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.05.2016, 20:59
|
|||
|---|---|---|---|
|
|||
Последовательная нумерация в пределах группы записей |
|||
|
#18+
да, спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.05.2016, 10:25
|
|||
|---|---|---|---|
Последовательная нумерация в пределах группы записей |
|||
|
#18+
expl0rerВ таком виде транзакционность мне не нужна - пропуски могут быть, главное чтобы их было не очень многоНу, тогда выбор простой - по любому своя таблица (таблицы) с номерами, и дальше либо простые запросы для получения номера, если производительность некритична, либо отдельные транзакции через CLR как в статье выше, если множество конкурентных обращений. PS ждём реализации в MSSQL нативных автономных транзакций :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=46&mobile=1&tid=1689866]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 265ms |
| total: | 432ms |

| 0 / 0 |
