Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Применение вычисляемых полей в качестве ключей  [new]
MSSQL_USER
Member

Откуда: Minsk
Сообщений: 59
Решил посоветоваться с сообществом.
Есть аналитическая база данных, где несколько таблиц связаны между собой по составному первичному ключу из трех полей:
1. Период - это год и квартал для анализа
2. Регион
3. Организация

Пользователями этой базы являются специалисты-аналитики, которые работают с ней через SQL запросы напрямую.
Все было хорошо, и вот тут пришло новое требование мне:
Хотят добавить вычисляемое поле, которое будет содержать в себе сумму полей первичного ключа, то есть
Период+Регион+Организация
Мотивируют тем, что легче писать SQL запросы.

Меня интересует чем может грозить на будущее использование подобного поля?
Может есть ограничения по индексации таких полей (быстродействие) или надежности вычислений?
Любы комментарии и опыт, если можно.

Спасибо.
29 сен 11, 15:02    [11355723]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
MSSQL_USER
Меня интересует чем может грозить на будущее использование подобного поля?
Может есть ограничения по индексации таких полей (быстродействие) или надежности вычислений?
Скорость вставки немного снизится (поле ведь будет пресистенс с индексом, правильно?)

А так больше ничем не грозит.
29 сен 11, 15:05    [11355761]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
MSSQL_USER,

А запросы, которые оп их мотивации "легче писать" можно увидеть?

ЗЫ. Добавьте им суррогатный PK.
29 сен 11, 15:05    [11355764]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
pkarklin
MSSQL_USER,

А запросы, которые оп их мотивации "легче писать" можно увидеть?

ЗЫ. Добавьте им суррогатный PK.


идти, так до конца. с таким PK поля Период, Регион и Организация можно вынести в отдельный справочник, а во всех исходных таблицах убрать эти поля и оставить только ссылки на справочник. :)
29 сен 11, 15:11    [11355846]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
Glory
Member

Откуда:
Сообщений: 104751
MSSQL_USER
Период+Регион+Организация
Мотивируют тем, что легче писать SQL запросы.

Легче это в смысле
вместо
where Период = ... and Регион = ... and Организация = в разных комбинациях
писать
where MyFiled LIKE 'и тут добавлять просто строку%' ?
29 сен 11, 15:13    [11355875]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
MSSQL_USER
Мотивируют тем, что легче писать SQL запросы.
Может правильно сказать "Легче писать говнокод"?
Хотя странно, обычно ани при этом умеют copy-past-ить.

VIEW / FUNCTION (праметризованные предаствления), и вообще повторное использование кода им в помощь.
29 сен 11, 15:39    [11356219]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
MSSQL_USER
Member

Откуда: Minsk
Сообщений: 59
А запросы, которые оп их мотивации "легче писать" можно увидеть?


Легче это в смысле
вместо
where t1.Период = t2.Период and t1.Регион = t2.Регион and t1.Организация = t2.Организация
пишут
where (t1.Период+t1.Регион+t1.Организация)=(t2.Период+t1.Регион+t2.Организация)
29 сен 11, 15:41    [11356241]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
MSSQL_USER
Member

Откуда: Minsk
Сообщений: 59
то есть после появления нового поля KEY = (Период+Регион+Организация)

вместо
where t1.Период = t2.Период and t1.Регион = t2.Регион and t1.Организация = t2.Организация
или
where (t1.Период+t1.Регион+t1.Организация)=(t2.Период+t1.Регион+t2.Организация)

будут писать
where t1.KEY=t2.KEY
29 сен 11, 15:50    [11356335]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
Glory
Member

Откуда:
Сообщений: 104751
MSSQL_USER
то есть после появления нового поля KEY = (Период+Регион+Организация)

вместо
where t1.Период = t2.Период and t1.Регион = t2.Регион and t1.Организация = t2.Организация
или
where (t1.Период+t1.Регион+t1.Организация)=(t2.Период+t1.Регион+t2.Организация)

будут писать
where t1.KEY=t2.KEY

А что, шаблоны запросов не в моде ?
Открыл - подставил свои значения - запустил
29 сен 11, 15:57    [11356420]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
MSSQL_USER
...будут писать
where t1.KEY=t2.KEY
Ну, дык, суррогатный ключ так и просится - 11355764...
30 сен 11, 06:23    [11359356]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
tpg
MSSQL_USER
...будут писать
where t1.KEY=t2.KEY
Ну, дык, суррогатный ключ так и просится - 11355764...
Думаете, аналитикам будет так удобнее?

По моему, идея про вычисляемое поле неплохая. Связи остаются как есть, но работать будет удобнее, чем сейчас.

В крайнем случае, можно просто оставить как есть, не делая никаких новых полей. Но уж не делать суррогатный ключ, это уж точно не увеличит удобство работы с базой.
30 сен 11, 09:32    [11359589]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
MSSQL_USER
несколько таблиц связаны между собой по составному первичному ключу из трех полей:
1. Период - это год и квартал для анализа
2. Регион
3. Организация
Три таблы у которых первичный ключ идентичный.
Аля Таблицы Имя, Фалмиля, Отчество? Т.е. не такого, что в какойто из таблиц всегда есть строчки для всех комбинации?

Можно добавить сурогатную таблу, но индексы по ним прямо не поставишь, только через view. В итоге получится тоже что одна общая табла, только в которой каждый их 3х блоков данных легче контролить (без CHECK-ов).
Что нельзя юзать через общее вью, это когда делается аналитаки разности(отсутсвие) одних блоков дынных от других (SEMI JOIN, Exists). Иначе юзаем одно общее вью и забываем про связку таблиц ваще.

Кароче, лучшее решение зависит от логики данных.
30 сен 11, 10:55    [11360181]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
MSSQL_USER
А запросы, которые оп их мотивации "легче писать" можно увидеть?


Легче это в смысле
вместо
where t1.Период = t2.Период and t1.Регион = t2.Регион and t1.Организация = t2.Организация
пишут
where (t1.Период+t1.Регион+t1.Организация)=(t2.Период+t1.Регион+t2.Организация)
Чего-то не пойму, а разве эти два условия эквивалентны?
Разве одинаковая сумма не может получиться для разных комбинаций слагаемых?
О чём топик? О тупых-претупых "специалистах-аналитиках"? Так это баян!
30 сен 11, 11:01    [11360244]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
Glory
Member

Откуда:
Сообщений: 104751
iap
Разве одинаковая сумма не может получиться для разных комбинаций слагаемых?

Там конкатенация наверное
30 сен 11, 11:02    [11360258]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Glory
iap
Разве одинаковая сумма не может получиться для разных комбинаций слагаемых?

Там конкатенация наверное
То есть, с выравниванием по ширине колонок?
Да, это очень удобно писать этакую длинную колбасу из нулей (скрупулёзно считая их количество!)
вместо написания такого же по длине нормального и понятного условия с AND!
30 сен 11, 11:11    [11360346]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
Glory
Member

Откуда:
Сообщений: 104751
iap
То есть, с выравниванием по ширине колонок?

тип char и так все выравняет сам
30 сен 11, 11:13    [11360376]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
iap
То есть, с выравниванием по ширине колонок?
Да, это очень удобно писать этакую длинную колбасу из нулей (скрупулёзно считая их количество!)
Ну понятно что там строковые ИД

Типа
Период+Регион+Организация
2011.09.30-MSK-VTB
или
2011.09.30-77-150, при этом ИД организаций и регионов люди обычно заучивают наизусть очень быстро

И потом строят запросики
... LIKE '2011.09.%-77-150'
или
... LIKE '2011.09.30-77-%'
30 сен 11, 11:19    [11360456]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
MSSQL_USER
Меня интересует чем может грозить на будущее использование подобного поля?
Если интересно чисто ради прикола (ибо на практике это явно кривизна рук), то т.к. FK пролетает, следовательно нет прямой связанности полей, и означает возможная генерация неоптимальных планов. В базе ведь не только эти три таблицы и их связки (и их способ) очень важны.

И хватит про миф легче писать.
30 сен 11, 11:32    [11360607]     Ответить | Цитировать Сообщить модератору
 Re: Применение вычисляемых полей в качестве ключей  [new]
MSSQL_USER
Member

Откуда: Minsk
Сообщений: 59
Большое всем спасибо за анализ данной ситуации и комментарии.

Ситуация с дополнительным полем действительно как-то избыточно смотрится:
- потенциально может привести к не оптимальному использованию SQL запросов (LIKE)
- замедление обновления и рост объема базы данных, в том числе и при архивировании (место все же надо экономить)
- постоянное слежение за данным полем при формировании нового аналитического периода (данное поле нельзя копировать!!!)

Удалось детально разобрался с проблемой на их стороне и удалось убедить не использовать вычисляемое поле.
30 сен 11, 14:22    [11362617]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить