Я бы выбрал вариант "комбинации", как вы предложили.
- сохранить фактическое содержимое в XML
- сохранить отношения как пары (абсолютных) XPath в базе данных, например
['/Act1/Regulation1/Section5/a', '/Act1/Section1/b/2']; ['/Act1/Regulation1/Section5/a', '/Act1/Regulation2/Section6']
(это 2 строки по 2 столбца в каждой, первый столбец не уникален, пары уникальны)
- сохранить обратное отношение в отдельной таблице с той же структурой (для обратного просмотра):
['/Act1/Section1/b/2', '/Act1/Regulation1/Section5/a']; ['/Act1/Regulation2/Section6', '/Act1/Regulation1/Section5/a']
(те же ограничения уникальности, что и выше)
Если вы хотите выполнить частичный поиск а-ля "Покажите мне, если /Act1/Regulation2
упоминается как /Act1/Regulation1
", вы можете добавить косвенное указание к кросс-таблицам (показано ниже), или если вам нужна чрезвычайная производительность (что я не думаю, что вы делаете, потому что, вероятно, не так много данных (менее 100 миллионов отношений)) вы можете использовать три исправления (как в префиксе и суффиксе)
relation_table (id, id):
[set_112, set119]
[set_112, set120]
set_table (id, prefix, is_full_path):
[set_112, '/Act1', false]
[set_112, '/Act1/Regulation1', false]
[set_112, '/Act1/Regulation1/Section5', true]
...
Это набор всех префиксов (и / или суффиксов) XPath. Ответ на запрос выше будет тогда:
SELECT set_id FROM set_table WHERE prefix = FOO
SELECT second_colum FROM relation_table WHERE first_column IN (set_112, ...)
(т.е. результат предыдущего запроса)
SELECT prefix FROM set_table WHERE set_id = RESULT_FROM_PREVIOUS AND is_full_path=true
Простите, если я не воспроизвел ваши примерные отношения прямо в моих примерах.
Редактировать: В зависимости от ваших потребностей в отношении выходных данных (и размера исходного XML-файла) я бы даже избегал проверок XPath в исходном документе и вместо этого сохранял бы фрагменты XML в базе данных (как и все остальные). фактические текстовые узлы, которые принадлежат каждому XPath), а затем на лету восстанавливают уменьшенную версию исходного XML.
Синтаксический анализ (и индексация) XML происходит медленно, печатая что-то как XML.