Я участвую в дебатах по XML-представлениям групп объектов. Учитывая иерархию объектов, таких как Artist, Album и Track, с высокой степенью связности между объектом, каковы плюсы и минусы форматирования представления XML данного графа объекта с глубоким XML по сравнению с использованием ссылок на объекты.
Я твердо нахожусь в лагере ссылок на объекты, в то время как другие утверждают, что эта модель почему-то менее «RESTful» и что ее следует преследовать только в том случае, если есть веская причина , а не для использования версии глубоких объектов .
Я считаю следующие фундаментальные недостатки со стороны глубоких объектов
- Циркулярные ссылки означают, что на графике может быть несколько версий одного и того же объекта. Некоторые объекты обязательно будут неполными.
- Если вы решите избегать циклических ссылок, имея только одну каноническую версию данного объекта в графе, вы возлагаете бремя на реализацию логики, чтобы определить, какой экземпляр в графе следует рассматривать как канонический. Кроме того, если вы создаете сервис, вы возлагаете это бремя как на клиентов, так и на серверы. Кроме того, эта логика должна разрешить тонны неясностей. Какой экземпляр объекта должен быть каноническим? Первый встречается при обходе предзаказа? Ближайший к корню (ширина первого обхода)? Конкретные родительские дочерние отношения?
- Каноническое представление данного объекта отсутствует, что существенно снижает возможности кэширования как на клиенте, так и на сервере.
- Вся логика для получения глубокого свойства должна иметь возможность извлекать содержащий глубинный объект как элемент верхнего уровня, потому что вы никогда не знаете, будет ли там глубокое свойство
- Схема становится бесполезной, потому что каждое соединение между объектами обязательно должно быть установлено так, чтобы оно происходило минимум 0 раз, чтобы избежать бесконечной регрессии от циклических ссылок.
Мой вопрос по существу, есть ли какие-то существенные аргументы для поверхностного представления, которые я пропустил, и каковы контраргументы
Вот небольшой пример глубокого объекта
<artist id="1234"> <!-- This object is of type Artist in the Schema-->
<name>Lady GaGa</name>
<sampleTrack id="1235"> <!-- This object is of type Track in the Schema-->
<name>Poker Face</name>
<album id="1236"> <!-- This object is of type Album in the Schema-->
<name>The Fame Monster</name>
...
</album>
</sampleTrack>
<album id="1236">
....
<track id="1235">
</track>
</album>
</artist>
Вот аналогичный пример использования ссылок на объекты
Леди Гага
<track id="1235"> <!-- This object is of type Track in the Schema-->
<name>Poker Face</name>
<album id="1236"/> <!-- This object is of type Reference in the Schema-->
</track>
<album id="1236">
<name>The Fame Monster</name>
<track id="1235">
</album>