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

Откуда:
Сообщений: 216
Здравствуйте!

Столкнулся с реальной проблеммой, требующей хранения данных в поле формата XML. Информации по XML очень много и я даже не знаю, с какого конца браться за проблемму.

Итак, попробую объяснить на примере, что требуется реализовать:

В разных приложениях берутся данные из одной таблицы, содержащих XML поле, в котором хранятся результаты расчетов по разным направлениям.
Вот пример элемента расчетных данных:
<*Имя элемента*>
  <Description>*Описание элемента*</Description>
  <Value>*Значение элемента*</Value>
</*Имя элемента*>
Элементов может быть несколько, точное число варьируется от расчета к расчету, соответственно в разных записях набор элементов может быть разным, значение элемента (Value) так же может иметь разный тип. В параметрах расчета всегда будет элемент <Type>, по которому собственно и идет разделение параметров по типам расчета. Приложения получают поле целиком и парсят его уже у себя так как им надо.

В итоге необходимо организовать хранение и поиск по коллекции элементов.

Пока реализовал все это через монструозную конструкцию записи в XML поле:
Select (Select (Select 'Описание' As [Description], 'Значение' As [Value] For XML PATH(''), TYPE, ELEMENTS)
        ...
        For XML PATH('Parameters'), TYPE, ELEMENTS) As [Parameters]
From [ParametersTableTable]
Получение параметра реализовано через .value('(/Parameters/*Имя параметра*/Value)[1]', 'int'), но поиск, естественно, очень медленный.

Читал литературы много, но бессистемно. В голове каша. Знаю, что есть схемы, но как их реально применить к текущей ситуации придумать не могу.

Пока есть какое то смутное предположение, что надо создавать схемы данных под каждый тип расчета, но не могу понять, можно ли использовать разные схемы в одном XML поле и как быть при добавлении/изменении/удалении какого либо элемента из схемы.

Пожалуйста, помогите советом, скажите, какую литературу/статьи читать, дайте ссылки. Буду рад любым советам.

P.S.
Архитектуру менять нельзя, надо адаптироваться к текущей ситуации.
14 дек 09, 17:12    [8065127]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Masygreen
Member

Откуда: Москва
Сообщений: 558
если чесно .. нихера не понятно ...
14 дек 09, 17:23    [8065203]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Alkatraz
Member

Откуда:
Сообщений: 216
Хорошо, можно проще.

Необходимо хранить параметры расчета в поле типа XML. Каждай элемент расчета должен содержать наименование, описание и значение. Кол-во элементов и их набор различается в зависимости от направления расчета (вида расчета).

Необходимо организовать хранение и выборку записей по значению и наименованию элемента расчета.

На текущий момент существует две расчетные процедуры, которые должны формировать набор расчитанных данных, где каждая запись содержит разное кол-во и набор элементов расчета. Сколько таких процедур будет в будущем неизвестно, поэтому надо попытаться создать максимально гибкий формат хранения и выборки элементов расчета...
14 дек 09, 17:31    [8065235]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
mike909
Member

Откуда:
Сообщений: 662
Alkatraz
Пока реализовал все это через монструозную конструкцию записи в XML поле:
Select (Select (Select 'Описание' As [Description], 'Значение' As [Value] For XML PATH(''), TYPE, ELEMENTS)
        ...
        For XML PATH('Parameters'), TYPE, ELEMENTS) As [Parameters]
From [ParametersTableTable]
Получение параметра реализовано через .value('(/Parameters/*Имя параметра*/Value)[1]', 'int'), но поиск, естественно, очень медленный.


Т.е. формирование XML-поля происходит в SQL_е ? Или записывается из вне ?
В любом случае имеет смысл хранить содержимое XML_я в реляционном представлении, а клиентам, мечтающим получать XML, подсунуть въюху ...
И архитектуру менять не нуна.
14 дек 09, 17:32    [8065237]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Alkatraz
Member

Откуда:
Сообщений: 216
mike909, к сожалению не получится пока... Это был бы идеальный вариант, но я не думаю, что пойдут на изменение архитектуры - кол-во расчетных элементов может сильно варьироваться в будущем, соответственно может изменять тип и набор самих расчетных элементов.
14 дек 09, 17:35    [8065256]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
mike909
Member

Откуда:
Сообщений: 662
Alkatraz
mike909, к сожалению не получится пока... Это был бы идеальный вариант, но я не думаю, что пойдут на изменение архитектуры - кол-во расчетных элементов может сильно варьироваться в будущем, соответственно может изменять тип и набор самих расчетных элементов.

И что мешает добавить пару справочных таблиц и кросс таблицу результатов, а на них повесить въюху с вожделенным XML полем ? Или это тоже "серьезное" изменение архитектуры ?
И при чем тут кол-во элементов ?
Или их тип ?

Вопрос лиш в том, кто сейчас формирует у Вас это XML поле:
1) Вы, приведенным запросом ?
2) Внешняя прога ?
И, как я уже говорил, от этого зависит лиш способ наполнения кросс таблицы ...

P.S. Если внешняя прога, то могут возникнуть сложности, которые тоже можно решить ...
14 дек 09, 17:46    [8065323]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Alkatraz
Member

Откуда:
Сообщений: 216
mike909, поле формирует процедура приведенным выше запросом.

Этой процедуры потом может и не быть, могут пройти изменения в алгоритме расчета, могут пройти изменения в типе элемента расчета. Все может быть. А отображать и соответственно хранить нужно именно то, что было на момент расчета.

Честно - мне кажется, что в данном конкретном случае XML подходит как нельзя лучше - при любом изменении в расчетных данных нужно только поправить саму процедуру расчета. Отображение на клиенте уже реализовано исходя из данных, записанных в XML на основании наименования элемента, его описания и значения.
14 дек 09, 17:53    [8065369]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
mike909
Member

Откуда:
Сообщений: 662
Alkatraz
mike909, поле формирует процедура приведенным выше запросом.

Ну тогда у Вас руки развязаны - можно использовать предложенный мною способ.
Alkatraz

Этой процедуры потом может и не быть, могут пройти изменения в алгоритме расчета, могут пройти изменения в типе элемента расчета. Все может быть. А отображать и соответственно хранить нужно именно то, что было на момент расчета.

И что мешает, кроме религии, сохранить наборы расчетов ? Или в про "тип" элемента расчетов ? Как на счет сохранить результат в SQL_Variant, ну или просто в nvarchar(max) ?
Alkatraz

Честно - мне кажется, что в данном конкретном случае XML подходит как нельзя лучше - при любом изменении в расчетных данных нужно только поправить саму процедуру расчета.

Опять же - что мешает "подправить" SP_шку в случае хранения результатов не в XML_е ?
Alkatraz

Отображение на клиенте уже реализовано исходя из данных, записанных в XML на основании наименования элемента, его описания и значения.

Ну а клиенты как получали XML, так и будут продолжать получать XML в обоих случаях.

P.S. Если Вы все же продолжите хранить результат в XML_е, то для ускорения поиска посмотрите в сторону XML-индексов, хотя это все равно будет более тормознуто ...
14 дек 09, 18:33    [8065590]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Alkatraz
Member

Откуда:
Сообщений: 216
mike909, действительно, я же говорил, что простая таблица с полями была бы мне предпочтительней, но задача стоит сделать хранение и поиск в XML...

Индексы XML работают только со схемами данных. Без схемы индекс занимает в разы больше самих данных. Проверено... С самими схемами понимания, как их правильно и эффективно использовать у меня нет...
14 дек 09, 18:52    [8065647]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Alkatraz,
mike909 вам ненавязчиво намекает, что гемороя с XML-ем вы получите размером с Гималаи, а польза только эстетическая.
Вы делали запросы по XML для больших таблиц? Смотрели сколько сжирается ресурсов?
Я вам скажу, что обойдётся вам это дороже чем ваша лень. И не только по ресурсам, но и по сопровождению и программированию. Это вам только кажется, что XML удобнее.

Посмотрите хотя бы в сторону sparse колонок. Ради вас, Alkatraz, MS даже XML интерфейс для них разработала.
14 дек 09, 21:18    [8066005]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Сервер совершенно не должно заботить как данные выглядят на клиенте.
Выкиньте полностью всю эту шнягу на клиент, или на крайняк на апликешн сервер.
Особенно этот идиотизм с Description. А разработчику "этих приложений" подсыпьте слабительного, чтоб окончательно пр...ся и переделал всё по человечески.
14 дек 09, 21:32    [8066038]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Alkatraz
Member

Откуда:
Сообщений: 216
Mnior, это все прекрасно, но когда я выйду на нормальную архитектуру я не знаю, а поэтому надеясь на лучшее, готовлюсь к худшему.

Это не моя лень мешает мне сделать отдельные таблицы для разных расчетов, а предъявленные требования. Если бы я мог так просто взять и все изменить, то думаете я бы создал эту тему?

Можно фантазировать сколько хочется, но надо решить задачу на текущем уровне.

Еще раз прошу помочь мне хотя бы с литературой, которые мне стоит почитать для первичного ознакомления - про XML схемы, основы проектирования XML и т.д.
14 дек 09, 22:09    [8066191]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Alkatraz
Это не моя лень мешает мне сделать отдельные таблицы для разных расчетов, а предъявленные требования. надо решить задачу на текущем уровне.
Какие нахрен требования. Вам что сверху говорят как делать?
Вам дали интерфейс клиента, а то что там у сервера внутрях должно быть быдлокодерам-клиенто-писателям по барабануи и касаться только вас. Поэтому не морочьте голову и пишите реляционно.
Интерфейс к сиквелу ещё не написан, так? Так. Ещё 100% не решено как к нему обращаться, так? Так.
Вот тут самое главное отделить мух от котлет и вынести мутотень в отдельную прослойку на каком нибудь более оптимальном для XML-я среде.

Alkatraz
поэтому надеясь на лучшее, готовлюсь к худшему.
Вот именно, не ставьте проект заранее в провальное состояние. Забудьте про хранение и селектирование из XML.

Alkatraz
Еще раз прошу помочь мне хотя бы с литературой, которые мне стоит почитать для первичного ознакомления - про XML схемы, основы проектирования XML и т.д.
1. Уже ткнул в sparse выше. Будте внимательны! Ёпрст.
2. И фиг тебе по неправильному пути посылать.
3. Схемы это ровно тоже самое, что и расписывать типы как говорил mike909. Только в стопяцот раз неудобнее и муторно. Если конечно просто не написать одну универсальную - но опять же фиг вам по неправильному.

XML только для узких вариантов используется:
1. Тупой сторе данных. Проверяется только валидность при сохранении.
2. Обращение к одиночному не структурному XML (без схемы или многовариантной схеме)
3. Обращение к структурному (жёсткая схема) XML нереляционного типа.
При этом максимально стараться вынести всё это за пределы сервера.
14 дек 09, 23:22    [8066422]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Alkatraz
Member

Откуда:
Сообщений: 216
Mnior, не надо горячиться. )

Возможно это вас шокирует, но да - мне говорят сверху что и как делать. Проект уже готовый, он функционирует вполне успешно, но расчеты имеют очень непостоянные алгоритмы. Так было задумано и так было реализовано. Хранение информации реализовано с помощью XML и это реально просто и удобно по сравнению с реляционными таблицами - уже на четвертом изменении алгоритма расчета всего одной процедуры я заколебался менять структуру таблицы с расчетными данными, пытаясь сохранить обратную совместимость. Когда было принято решение о использовании XML я реально вздохнул свободнее - изменения в данном случае касаются только самого алгоритма расчета и соответствующей процедуры.

Я еще раз повторяю - вы думаете я бы создал здесь тему, имея в запасе альтернативные варианты решений?

Sparse не подходит по условиям реализации - структура столбцов может часто меняться, реляционная таблица не подходит по той же причине - необходима обратная совместимость и сохранение ранее рассчитанных данных "как есть". Я упарюсь менять структуру данных и соответствующие вьюхи как только поменяется тип элемента расчета.

Пока реальной альтернативой является реляционная таблица той же структуры, что и элемент расчета, т.е. три поля, описывающие элемент и ссылка на запись расчета. Но тут надо много переделывать в процессе записи, поиска и извлечения информации. Это все будет нескоро, если вообще оправдает себя.

На текущий момент я ищу способы оптимизировать текущий вариант. Так как опыта по использованию XML у меня практически нет, я вполне мог накасячить с реализацией просто потому, что не владел нужной информацией.

Пока я не использую схемы XML, вы упомянули о многовариантных схесах, попробую копать в этом направлении, спасибо.
15 дек 09, 00:18    [8066561]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Alkatraz
Хранение информации реализовано с помощью XML и это реально просто и удобно по сравнению с реляционными таблицами
Не надо заливать, не удобно это - не удобно.
Alkatraz
уже на четвертом изменении алгоритма расчета всего одной процедуры я заколебался менять структуру таблицы с расчетными данными, пытаясь сохранить обратную совместимость.
Да какая разница XML не XML - поддерживание обратной совместимости в любом случае геморно. А с XML ещё хуже.

Alkatraz
изменения в данном случае касаются только самого алгоритма расчета и соответствующей процедуры.
Вот заливаете. Вам нужно ещё и отбирать и поддерживать обратную совместимость - для каждой версии свой оптимальный индекс ........ до бесконечности.

Alkatraz
Я еще раз повторяю - вы думаете я бы создал здесь тему, имея в запасе альтернативные варианты решений?
Нет. Для этого нужно понимать до конца задачу.

Вы понимаете, что логика решения задачи совершенно не зависит от способа записи этого решения. Вы всё равно должны все элементы это-го решения реализовать, как бы вы не выёживались. Так что не говорите, про то что с XML как-то магическим способом что-то там решается автоматически.

Alkatraz
Sparse не подходит по условиям реализации - структура столбцов может часто меняться, реляционная таблица не подходит по той же причине - необходима обратная совместимость и сохранение ранее рассчитанных данных "как есть". Я упарюсь менять структуру данных и соответствующие вьюхи как только поменяется тип элемента расчета.
Опять гоните. Вам нужно только успевать добавлять столбцы в таблицу. Сиквел будет выдавать XML на основе имеющихся данных для этой строки. Про старые строки/столбцы вы можете забить.

Было у вас <C1>V1</C1><C2>V2</C2><C3>V3</C3>, стало <C2>V2</C2><C4>V4</C4>. Тупо добавьте колонку С4 (С2 того-же типа, ина смысл называть его С2). Или просто при создании новой версии добавляйте новый набор колонок:
<V1_C1>V1</V1_C1><V1_C2>V2</V1_C2> ---> <V2_C1>V1</V2_C1><V2_C2>V2</V2_C2> --> ...
Ну и индексы к ним.

Alkatraz
Пока реальной альтернативой является реляционная таблица той же структуры, что и элемент расчета. Но тут надо много переделывать в процессе записи, поиска и извлечения информации
, если вообще оправдает себя.
Что тут делать - тут делать нечего.
Вот именно у вас это если, а в XML вы свято и слепо верите. Чтобы принимать решения нужны результаты сравнений, а у вас только "если".

Alkatraz
На текущий момент я ищу способы оптимизировать текущий вариант. Так как опыта по использованию XML у меня практически нет, я вполне мог накасячить с реализацией просто потому, что не владел нужной информацией.
Пока вы ищите способы для XML, сто раз бы нарисовали таблу и запросы к ней. И проблема не в ваших косяках, а в подобающем использовании сервера.

Надёюсь вы избавились от Description?
Преобразовать
<*Имя элемента*>*Значение элемента*</*Имя элемента*>
в
<*Имя элемента*>
<Description>*Описание элемента*</Description>
<Value>*Значение элемента*</Value>
</*Имя элемента*>
Как два пальца об... если на то уж пошло.
Тут даже сиквел не причём. Можно в отдельную функцию обвернуть. Хоть на клиенте хоть на сервере. Хоть тупым XSLT где-то в промежутке.
15 дек 09, 01:36    [8066636]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Alkatraz
Member

Откуда:
Сообщений: 216
Mnior, простите, но я не желаю с вами спорить. Вы либо не понимаете проблеммы, либо я не умею их объяснять. Проблемма обратной совместимости и ведения истории расчетов не позволяет реализовать хранение в реляционной таблице без каких то либо дополнительных затрат времени на доработку не только структуры таблицы, но и обслуживающих ее вьюх и процедур. Изменение структуры расчетного элемента вообще не рассматривается - на то есть объективные причины.

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

Давайте больше не будем отвлекаться на флуд, хорошо?
15 дек 09, 09:11    [8066884]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Alkatraz
Вы либо не понимаете проблеммы, либо я не умею их объяснять. Проблемма обратной совместимости и ведения истории расчетов не позволяет реализовать хранение в реляционной таблице без каких то либо дополнительных затрат времени на доработку не только структуры таблицы, но и обслуживающих ее вьюх и процедур. Изменение структуры расчетного элемента вообще не рассматривается - на то есть объективные причины.
Вот именно, только болтология без единого аргумента. Вы даже не пытались "объяснять".

Как бы не менялась "структура расчетного элемента" это никак не влияет на структуру таблиц - в случае таблицы деталей. Это вам уже третий раз говорят.
Глобальная смена "структура расчетного элемента" палюбому кардинально меняет запросы и структуру таблиц и схем в случае с XML.

В случае с sparse колонок в момент смены "структура расчетного элемента" нуна только пару команд.
ALTER TABLE ADD SPARCE и CREATE INDEX и всё! Никаких запросов и вьюх менять не надо. При этом это можно сделать автоматически.
15 дек 09, 14:51    [8069470]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Alkatraz
Member

Откуда:
Сообщений: 216
Mnior, я знаю, о чем вы мне хотите сказать. Как я уже говорил я НЕМОГУ поменять архитектуру единомоментно. Приходится поддерживать то, что уже есть.
15 дек 09, 18:10    [8071248]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
M0us
Member

Откуда: Moscow
Сообщений: 883
Alkatraz
Еще раз прошу помочь мне хотя бы с литературой, которые мне стоит почитать для первичного ознакомления - про XML схемы, основы проектирования XML и т.д.


Подборка ссылок и литературы
15 дек 09, 18:24    [8071331]     Ответить | Цитировать Сообщить модератору
 Re: XML для новичка - объясните на примере  [new]
Alkatraz
Member

Откуда:
Сообщений: 216
M0us, ага, спасибо большое!
16 дек 09, 14:27    [8075507]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить