|
|
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
MSSQL 2005 дано: большая таблица фактов, в которую сыплется 3 разные сущности ( накладные , заказы,остатки). точка входа процедура вставки. задача: разделить на 3 таблици (нормализация) Сложности: для сохранения уже написанных отчетов будет существовать представление/ Имеется PK identity , как мне сохранить единый сквозной PK при вставке новых записей. есть 2 врианта: 1 тригер на каждую из 3х новых таблиц на insert который выбирает из 3х максимальное значение ключа и вставляет +1 с IDENTITY_INSERT ON 2 в процедуре вставки проводить аналогичные операции Вопрос, можно ли придумать более элегантное решение, к примеру с применением ограничений или суррогатных ключей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 13:04 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
kain111MSSQL 2005 дано: большая таблица фактов, в которую сыплется 3 разные сущности ( накладные , заказы,остатки). точка входа процедура вставки. задача: разделить на 3 таблици (нормализация) Сложности: для сохранения уже написанных отчетов будет существовать представление/ Имеется PK identity , как мне сохранить единый сквозной PK при вставке новых записей. есть 2 врианта: 1 тригер на каждую из 3х новых таблиц на insert который выбирает из 3х максимальное значение ключа и вставляет +1 с IDENTITY_INSERT ON 2 в процедуре вставки проводить аналогичные операции Вопрос, можно ли придумать более элегантное решение, к примеру с применением ограничений или суррогатных ключей. Для таких целей придуманы диапазоны ключей. Т.е. на одной таблице вы генератор инициализируете 1, на второй - 1000000001, на третьей - 2000000001, и наслаждаетесь. Я думаю миллиард накладных вы наберете не скоро Но если опасаетесь - сделайте ключ bigint. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 13:20 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
была такая идея, но показалась слишком простой ) и потому подозрительной спасибо, пожалуй так и сделаю, чтобы не выдумывать сложностей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 13:24 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
а зачем сохранять уникальность? в представлении всегда можно добиться уникальности искусственно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 13:37 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
Naf, не совсем полно изложил данные. планируемые манипуляции предстоят над шапкой, есть еще и таблица деталей, связь с которой предстоит как раз по этому ключу. в Дальнейшем детали для каждой сущности тоже планируется разделить. Но опять же хочется сохранить преемственность, и возможность воссоздать первоначальный вид в представлении ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 13:43 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
на данный момент склоняюсь к написанию своей функции аналога oracle sequence ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 14:41 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
kain111на данный момент склоняюсь к написанию своей функции аналога oracle sequence Это называется не выдумывать сложностей?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 14:47 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
iljy, код мне кажется не таким сложным, а решение более элегантным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 15:03 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
kain111, GUID чем не подходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 15:30 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
kain111, Ну создай 3 таблицы. Перепиши отчеты. Перенеси данные. Непойму за что пытаетесь побороться?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 15:38 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
egorychkain111, GUID чем не подходит? происходит частое соединение по этому ключу с деталями, если будет varchar GUID то это утяжелит базу Злой БобрНу создай 3 таблицы. Перепиши отчеты. Перенеси данные. Непойму за что пытаетесь побороться?.. за производительность все, чего же еще может быть. ну и за общей организацией структуры, долго пересказывать, а на судьбу жаловаться не хочется :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 15:49 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
kain111iljy, код мне кажется не таким сложным, а решение более элегантным.Интересно, чем это решение элегантнее IDENTITY с разделением диапазонов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 15:57 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
alexeyvgkain111iljy, код мне кажется не таким сложным, а решение более элегантным.Интересно, чем это решение элегантнее IDENTITY с разделением диапазонов? нет пустых значений, к примеру можно восстановить последовательность появления каждой записи. Ну и я тут работаю не долго и потому просто пока стесняюсь делать такие резкие изменения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 16:23 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
kain111alexeyvgпропущено... Интересно, чем это решение элегантнее IDENTITY с разделением диапазонов? нет пустых значений, к примеру можно восстановить последовательность появления каждой записи. Ну и я тут работаю не долго и потому просто пока стесняюсь делать такие резкие изменения. Если эта последовательность важна - надо вводить поле типа даты появления, а не изобретать велосипед с квадратными колесами. GUID - это не varchar, а binary(16), так что утяжеление базы будет очень незначительным. Другое дело, что уид не рекомендуется использовать в качестве кластерного индекса, да и вообще индекс по гуид будет быстро фрагментироваться. Вот только все эти проблемы довольно мелкие по сравнению с адекватной реализацией собственного счетчика. Хотя в Denali последовательности они заявили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 17:03 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
kain111alexeyvgИнтересно, чем это решение элегантнее IDENTITY с разделением диапазонов? нет пустых значений, к примеру можно восстановить последовательность появления каждой записи.С IDENTITY пустые значения не вставятся. Последовательность лучьше определять по времени вставки. kain111Ну и я тут работаю не долго и потому просто пока стесняюсь делать такие резкие изменения.Как раз сразу придумывать сиквенс для MSSQL - это слишком резко :-) Ну и напортачить можно, это дело непростое с непривычки. А с IDENTITY будет работать правильно на 100% при нулевой трудоёмкости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 17:27 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
alexeyvgА с IDENTITY будет работать правильно на 100% при нулевой трудоёмкости.диапазоны имеют склонность заканчиваться в самый неподходящий для этого момент ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 18:03 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
возможно пояснение изменит мнение. вставка происходит единожды в день одной функцией вызываемой последовательно отдельным сервисом. Табличка очень тяжелая, по сути являющаяся рабочей табличкой с большим колличеством избыточной информации призванной обеспечить доставку и синхронизацию информации, например GUID генерируемые с КПК. Табличка тяжелая (шапка 9млн+ детали 120млн) и сильно растет(500к деталей в день). Моя позиция осложняется желаниями начальства + большой текучкой когда многие задумки и объяснения просто канули в лету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 18:03 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
egorychalexeyvgА с IDENTITY будет работать правильно на 100% при нулевой трудоёмкости.диапазоны имеют склонность заканчиваться в самый неподходящий для этого момент Я вас умоляю, что вы туда хотите вставлять такого, чтоб bigint закончился При объявленых 500к в день обычного инта хватит лет на 10, а уж bigint скорее всего переживет даже гибель вселенной. kain111возможно пояснение изменит мнение. вставка происходит единожды в день одной функцией вызываемой последовательно отдельным сервисом. Табличка очень тяжелая, по сути являющаяся рабочей табличкой с большим колличеством избыточной информации призванной обеспечить доставку и синхронизацию информации, например GUID генерируемые с КПК. Табличка тяжелая (шапка 9млн+ детали 120млн) и сильно растет(500к деталей в день). Моя позиция осложняется желаниями начальства + большой текучкой когда многие задумки и объяснения просто канули в лету. Вот сейчас я не понял. Если у вас уже есть GUID - так используйте его и не плодите сущности! А темы с реализацией собственного счетчика регулярно всплывают на форуме по MSSQL, и все они так или иначе имеют недостатки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 18:18 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
iljyegorychдиапазоны имеют склонность заканчиваться в самый неподходящий для этого момент Я вас умоляю, что вы туда хотите вставлять такого, чтоб bigint закончился При объявленых 500к в день обычного инта хватит лет на 10, а уж bigint скорее всего переживет даже гибель вселенной.Во-во. Это как надо запроектировать и эксплуатировать, что бы идентификаторы заканчивались, да ещё и втайне от администраторов и разработчиков ("в самый неподходящий для этого момент") :-) iljykain111возможно пояснение изменит мнение. вставка происходит единожды в день одной функцией вызываемой последовательно отдельным сервисом. Табличка очень тяжелая, по сути являющаяся рабочей табличкой с большим колличеством избыточной информации призванной обеспечить доставку и синхронизацию информации, например GUID генерируемые с КПК. Табличка тяжелая (шапка 9млн+ детали 120млн) и сильно растет(500к деталей в день). Моя позиция осложняется желаниями начальства + большой текучкой когда многие задумки и объяснения просто канули в лету. Вот сейчас я не понял. Если у вас уже есть GUID - так используйте его и не плодите сущности! А темы с реализацией собственного счетчика регулярно всплывают на форуме по MSSQL, и все они так или иначе имеют недостатки.Как я понял, сейчас не гуид, а интеджер идентити на одной табличке. По производительности с GUID действительно будет некоторый проигрыш; если таблица узкая, много ссылок, много индексов - то заметный, хотя и не настолько, чтобы о таком варианте забыть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 18:26 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
kain111, не сочтите за флейм, но я как раз сейчас пытаюсь запихнуть в одну таблицу 10 разных сущностей с одним UniqueID, а вы как раз наоборот. Сейчас приходится искать в 10 таблицах по UniqueID(bigint). При том что значения сущнойстей храняться в отдельной таблице. Геморно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 19:23 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
onedes, не сочту, сама идея разделения мне тоже не кажется до конца правильный, но опыта пока предвидеть все подводные камни маловато, а начальник видит этот шаг разумным. авторiljy kain111 возможно пояснение изменит мнение. вставка происходит единожды в день одной функцией вызываемой последовательно отдельным сервисом. Табличка очень тяжелая, по сути являющаяся рабочей табличкой с большим колличеством избыточной информации призванной обеспечить доставку и синхронизацию информации, например GUID генерируемые с КПК. Табличка тяжелая (шапка 9млн+ детали 120млн) и сильно растет(500к деталей в день). Моя позиция осложняется желаниями начальства + большой текучкой когда многие задумки и объяснения просто канули в лету. Вот сейчас я не понял. Если у вас уже есть GUID - так используйте его и не плодите сущности! А темы с реализацией собственного счетчика регулярно всплывают на форуме по MSSQL, и все они так или иначе имеют недостатки. Как я понял, сейчас не гуид, а интеджер идентити на одной табличке. По производительности с GUID действительно будет некоторый проигрыш; если таблица узкая, много ссылок, много индексов - то заметный, хотя и не настолько, чтобы о таком варианте забыть. GUID 32 чар, генерится на кпк дистрибьюторов обычной виндовой функцией, потом сливается инфа в их локальную базу, проверяясь на уникальность по этому guid, затем в общее хранилище уникальность идет уже по коду дистрибьютера и его PK int identity, в частности нехитрым скриптом я нашел дублирующиеся у нас в таблице записи GUID.какая то неправильная реализация на стороне дистрибьютора. В связи с 1й неделей месяца, а сервер обычно бывает нагружен под 80%, мероприятия откладываются и есть время подумать. Спасибо за мысли и изложенный опыт. Вариант с диапазонами кажется заманчивым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2011, 10:58 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
iljyна одной таблице вы генератор инициализируете 1, на второй - 1000000001, на третьей - 2000000001, и наслаждаетесь. Я думаю миллиард накладных вы наберете не скоро Но если опасаетесь - сделайте ключ bigint. Проще на одной тогда сделать 1, на второй 2, на третьей 3 и шаг 3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2011, 01:55 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
ВерблюдПроще на одной тогда сделать 1, на второй 2, на третьей 3 и шаг 3 Или внешнюю таблицу с PK identity, а из всех трех сделать FK на нее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2011, 02:01 |
|
||
|
PK для разделяемой на части таблици
|
|||
|---|---|---|---|
|
#18+
Верблюдiljyна одной таблице вы генератор инициализируете 1, на второй - 1000000001, на третьей - 2000000001, и наслаждаетесь. Я думаю миллиард накладных вы наберете не скоро Но если опасаетесь - сделайте ключ bigint. Проще на одной тогда сделать 1, на второй 2, на третьей 3 и шаг 3 Да ради бога. Принцип разбиения на диапазоны может быть любым. Просто если что - визуально определить принадлежность проще по первой цифре, чем по признаку деления на 3. ВерблюдВерблюдПроще на одной тогда сделать 1, на второй 2, на третьей 3 и шаг 3 Или внешнюю таблицу с PK identity, а из всех трех сделать FK на нее. А вот это плохая идея. Это один из вариантов построения собственного счетчика. Соответственно для групповой вставки придется делать значение по умолчанию в виде функции, возвращающей новое значение и т.п. ВК тут в принципе лишний - какой смысл еще одну таблицу тащить? Без него она просто очищается регулярно, и все. Вариант возможный, но в данном случае совершенно избыточный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2011, 13:27 |
|
||
|
|

start [/forum/topic.php?fid=32&tid=1542173]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
175ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 511ms |

| 0 / 0 |
