powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / PK для разделяемой на части таблици
27 сообщений из 27, показаны все 2 страниц
PK для разделяемой на части таблици
    #37239954
kain111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MSSQL 2005
дано: большая таблица фактов, в которую сыплется 3 разные сущности ( накладные , заказы,остатки). точка входа процедура вставки.
задача: разделить на 3 таблици (нормализация)
Сложности: для сохранения уже написанных отчетов будет существовать представление/ Имеется PK identity , как мне сохранить единый сквозной PK при вставке новых записей.

есть 2 врианта:
1 тригер на каждую из 3х новых таблиц на insert который выбирает из 3х максимальное значение ключа и вставляет +1 с IDENTITY_INSERT ON
2 в процедуре вставки проводить аналогичные операции

Вопрос, можно ли придумать более элегантное решение, к примеру с применением ограничений или суррогатных ключей.
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240000
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kain111MSSQL 2005
дано: большая таблица фактов, в которую сыплется 3 разные сущности ( накладные , заказы,остатки). точка входа процедура вставки.
задача: разделить на 3 таблици (нормализация)
Сложности: для сохранения уже написанных отчетов будет существовать представление/ Имеется PK identity , как мне сохранить единый сквозной PK при вставке новых записей.

есть 2 врианта:
1 тригер на каждую из 3х новых таблиц на insert который выбирает из 3х максимальное значение ключа и вставляет +1 с IDENTITY_INSERT ON
2 в процедуре вставки проводить аналогичные операции

Вопрос, можно ли придумать более элегантное решение, к примеру с применением ограничений или суррогатных ключей.
Для таких целей придуманы диапазоны ключей. Т.е. на одной таблице вы генератор инициализируете 1, на второй - 1000000001, на третьей - 2000000001, и наслаждаетесь. Я думаю миллиард накладных вы наберете не скоро Но если опасаетесь - сделайте ключ bigint.
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240014
kain111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
была такая идея, но показалась слишком простой ) и потому подозрительной
спасибо, пожалуй так и сделаю, чтобы не выдумывать сложностей.
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240053
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем сохранять уникальность?
в представлении всегда можно добиться уникальности искусственно
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240068
kain111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Naf,

не совсем полно изложил данные. планируемые манипуляции предстоят над шапкой, есть еще и таблица деталей, связь с которой предстоит как раз по этому ключу. в Дальнейшем детали для каждой сущности тоже планируется разделить. Но опять же хочется сохранить преемственность, и возможность воссоздать первоначальный вид в представлении
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240231
kain111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на данный момент склоняюсь к написанию своей функции аналога oracle sequence
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240244
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kain111на данный момент склоняюсь к написанию своей функции аналога oracle sequence
Это называется не выдумывать сложностей??
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240281
kain111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iljy,
код мне кажется не таким сложным, а решение более элегантным.
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240353
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kain111,

GUID чем не подходит?
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240385
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kain111,

Ну создай 3 таблицы. Перепиши отчеты. Перенеси данные.
Непойму за что пытаетесь побороться?..
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240426
kain111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychkain111,

GUID чем не подходит?

происходит частое соединение по этому ключу с деталями, если будет varchar GUID то это утяжелит базу

Злой БобрНу создай 3 таблицы. Перепиши отчеты. Перенеси данные.
Непойму за что пытаетесь побороться?..
за производительность все, чего же еще может быть. ну и за общей организацией структуры, долго пересказывать, а на судьбу жаловаться не хочется :)
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240457
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kain111iljy,
код мне кажется не таким сложным, а решение более элегантным.Интересно, чем это решение элегантнее IDENTITY с разделением диапазонов?
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240547
kain111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgkain111iljy,
код мне кажется не таким сложным, а решение более элегантным.Интересно, чем это решение элегантнее IDENTITY с разделением диапазонов?
нет пустых значений,
к примеру можно восстановить последовательность появления каждой записи.
Ну и я тут работаю не долго и потому просто пока стесняюсь делать такие резкие изменения.
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240638
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kain111alexeyvgпропущено...
Интересно, чем это решение элегантнее IDENTITY с разделением диапазонов?
нет пустых значений,
к примеру можно восстановить последовательность появления каждой записи.
Ну и я тут работаю не долго и потому просто пока стесняюсь делать такие резкие изменения.
Если эта последовательность важна - надо вводить поле типа даты появления, а не изобретать велосипед с квадратными колесами.
GUID - это не varchar, а binary(16), так что утяжеление базы будет очень незначительным. Другое дело, что уид не рекомендуется использовать в качестве кластерного индекса, да и вообще индекс по гуид будет быстро фрагментироваться. Вот только все эти проблемы довольно мелкие по сравнению с адекватной реализацией собственного счетчика. Хотя в Denali последовательности они заявили.
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240692
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kain111alexeyvgИнтересно, чем это решение элегантнее IDENTITY с разделением диапазонов?
нет пустых значений,
к примеру можно восстановить последовательность появления каждой записи.С IDENTITY пустые значения не вставятся.
Последовательность лучьше определять по времени вставки.

kain111Ну и я тут работаю не долго и потому просто пока стесняюсь делать такие резкие изменения.Как раз сразу придумывать сиквенс для MSSQL - это слишком резко :-)

Ну и напортачить можно, это дело непростое с непривычки.

А с IDENTITY будет работать правильно на 100% при нулевой трудоёмкости.
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240760
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgА с IDENTITY будет работать правильно на 100% при нулевой трудоёмкости.диапазоны имеют склонность заканчиваться в самый неподходящий для этого момент
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240761
kain111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно пояснение изменит мнение. вставка происходит единожды в день одной функцией вызываемой последовательно отдельным сервисом. Табличка очень тяжелая, по сути являющаяся рабочей табличкой с большим колличеством избыточной информации призванной обеспечить доставку и синхронизацию информации, например GUID генерируемые с КПК. Табличка тяжелая (шапка 9млн+ детали 120млн) и сильно растет(500к деталей в день). Моя позиция осложняется желаниями начальства + большой текучкой когда многие задумки и объяснения просто канули в лету.
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240794
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychalexeyvgА с IDENTITY будет работать правильно на 100% при нулевой трудоёмкости.диапазоны имеют склонность заканчиваться в самый неподходящий для этого момент
Я вас умоляю, что вы туда хотите вставлять такого, чтоб bigint закончился При объявленых 500к в день обычного инта хватит лет на 10, а уж bigint скорее всего переживет даже гибель вселенной.

kain111возможно пояснение изменит мнение. вставка происходит единожды в день одной функцией вызываемой последовательно отдельным сервисом. Табличка очень тяжелая, по сути являющаяся рабочей табличкой с большим колличеством избыточной информации призванной обеспечить доставку и синхронизацию информации, например GUID генерируемые с КПК. Табличка тяжелая (шапка 9млн+ детали 120млн) и сильно растет(500к деталей в день). Моя позиция осложняется желаниями начальства + большой текучкой когда многие задумки и объяснения просто канули в лету.
Вот сейчас я не понял. Если у вас уже есть GUID - так используйте его и не плодите сущности! А темы с реализацией собственного счетчика регулярно всплывают на форуме по MSSQL, и все они так или иначе имеют недостатки.
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240805
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iljyegorychдиапазоны имеют склонность заканчиваться в самый неподходящий для этого момент
Я вас умоляю, что вы туда хотите вставлять такого, чтоб bigint закончился При объявленых 500к в день обычного инта хватит лет на 10, а уж bigint скорее всего переживет даже гибель вселенной.Во-во.

Это как надо запроектировать и эксплуатировать, что бы идентификаторы заканчивались, да ещё и втайне от администраторов и разработчиков ("в самый неподходящий для этого момент") :-)

iljykain111возможно пояснение изменит мнение. вставка происходит единожды в день одной функцией вызываемой последовательно отдельным сервисом. Табличка очень тяжелая, по сути являющаяся рабочей табличкой с большим колличеством избыточной информации призванной обеспечить доставку и синхронизацию информации, например GUID генерируемые с КПК. Табличка тяжелая (шапка 9млн+ детали 120млн) и сильно растет(500к деталей в день). Моя позиция осложняется желаниями начальства + большой текучкой когда многие задумки и объяснения просто канули в лету.
Вот сейчас я не понял. Если у вас уже есть GUID - так используйте его и не плодите сущности! А темы с реализацией собственного счетчика регулярно всплывают на форуме по MSSQL, и все они так или иначе имеют недостатки.Как я понял, сейчас не гуид, а интеджер идентити на одной табличке.

По производительности с GUID действительно будет некоторый проигрыш; если таблица узкая, много ссылок, много индексов - то заметный, хотя и не настолько, чтобы о таком варианте забыть.
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37240904
onedes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kain111,
не сочтите за флейм, но я как раз сейчас пытаюсь запихнуть в одну таблицу 10 разных сущностей с одним UniqueID, а вы как раз наоборот.
Сейчас приходится искать в 10 таблицах по UniqueID(bigint). При том что значения сущнойстей храняться в отдельной таблице. Геморно.
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37243255
kain111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onedes,

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

авторiljy
kain111
возможно пояснение изменит мнение. вставка происходит единожды в день одной функцией вызываемой последовательно отдельным сервисом. Табличка очень тяжелая, по сути являющаяся рабочей табличкой с большим колличеством избыточной информации призванной обеспечить доставку и синхронизацию информации, например GUID генерируемые с КПК. Табличка тяжелая (шапка 9млн+ детали 120млн) и сильно растет(500к деталей в день). Моя позиция осложняется желаниями начальства + большой текучкой когда многие задумки и объяснения просто канули в лету.

Вот сейчас я не понял. Если у вас уже есть GUID - так используйте его и не плодите сущности! А темы с реализацией собственного счетчика регулярно всплывают на форуме по MSSQL, и все они так или иначе имеют недостатки.
Как я понял, сейчас не гуид, а интеджер идентити на одной табличке.

По производительности с GUID действительно будет некоторый проигрыш; если таблица узкая, много ссылок, много индексов - то заметный, хотя и не настолько, чтобы о таком варианте забыть.

GUID 32 чар, генерится на кпк дистрибьюторов обычной виндовой функцией, потом сливается инфа в их локальную базу, проверяясь на уникальность по этому guid, затем в общее хранилище уникальность идет уже по коду дистрибьютера и его PK int identity, в частности нехитрым скриптом я нашел дублирующиеся у нас в таблице записи GUID.какая то неправильная реализация на стороне дистрибьютора.

В связи с 1й неделей месяца, а сервер обычно бывает нагружен под 80%, мероприятия откладываются и есть время подумать. Спасибо за мысли и изложенный опыт. Вариант с диапазонами кажется заманчивым.
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37246479
Фотография Верблюд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iljyна одной таблице вы генератор инициализируете 1, на второй - 1000000001, на третьей - 2000000001, и наслаждаетесь. Я думаю миллиард накладных вы наберете не скоро Но если опасаетесь - сделайте ключ bigint.

Проще на одной тогда сделать 1, на второй 2, на третьей 3 и шаг 3
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37246481
Фотография Верблюд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВерблюдПроще на одной тогда сделать 1, на второй 2, на третьей 3 и шаг 3

Или внешнюю таблицу с PK identity, а из всех трех сделать FK на нее.
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37247213
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Верблюдiljyна одной таблице вы генератор инициализируете 1, на второй - 1000000001, на третьей - 2000000001, и наслаждаетесь. Я думаю миллиард накладных вы наберете не скоро Но если опасаетесь - сделайте ключ bigint.

Проще на одной тогда сделать 1, на второй 2, на третьей 3 и шаг 3
Да ради бога. Принцип разбиения на диапазоны может быть любым. Просто если что - визуально определить принадлежность проще по первой цифре, чем по признаку деления на 3.
ВерблюдВерблюдПроще на одной тогда сделать 1, на второй 2, на третьей 3 и шаг 3

Или внешнюю таблицу с PK identity, а из всех трех сделать FK на нее.
А вот это плохая идея. Это один из вариантов построения собственного счетчика. Соответственно для групповой вставки придется делать значение по умолчанию в виде функции, возвращающей новое значение и т.п. ВК тут в принципе лишний - какой смысл еще одну таблицу тащить? Без него она просто очищается регулярно, и все. Вариант возможный, но в данном случае совершенно избыточный.
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37256505
+5 коп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kain111,
а составной PK почему не подходит?
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37258355
kain111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
dbcc checkident (table_name, reseed,  1000000000 ) 
переопределяет identity для таблицы, т.е. следующая вставленная запись будет имет номер 1000000001, я проверял )
...
Рейтинг: 0 / 0
PK для разделяемой на части таблици
    #37258374
kain111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+5 коп ,
имеется ввиду PK из нескольких столбцов ?
вроде бы выше написано, для поддержания наследственности будет существовать view в которой будет уникальное имя. лишнюю логику на view вешать не считаю разумно
если нет, то не могли бы подробнее ?
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / PK для разделяемой на части таблици
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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