XML-реляционное отображение для сложных элементов с несколькими родителями - PullRequest
0 голосов
/ 07 марта 2012

Я недавно задал этот вопрос на Сведение XML-данных в схему базы данных с XMLSpy , но я все еще борюсь с этим.Это также не совсем вопрос XMLSpy, поэтому я делаю его другим способом.

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

Например:

<?xml version="1.0" encoding="UTF-8"?>
<a>
    quux
    <b>
        corge
        <c>
            grault
            <d>
                garply
                <e>
                    waldo
                    <f>foo</f>
                </e>
            </d>
            <e>
                fred
                <f>bar</f>
            </e>
        </c>
        <e>
            plugh
            <f>baz</f>
        </e>
    </b>
    <e>
        xyzzy
        <f>qux</f>
    </e>
</a>

Обратите внимание, что элемент <e> (сложный, поскольку он содержит элемент <f>) может быть дочерним по отношению к <a>,<b>, <c> или <d>.

Непрактично сопоставлять это со структурой таблицы:

  • A : (a_pk,a)
  • B : (b_pk, a_fk, b)
  • C : (c_pk, b_fk, c)
  • D : (d_pk, c_fk, d)
  • E : (e_pk,? _Fk, e, f)

Потому что Eна самом деле является дочерней таблицей из нескольких таблиц (A, B, C и D).

Какой лучший способ исправить это?

  1. Создать несколько таблиц E,по одному на каждое возможное объединение:

    • A : (a_pk, a)
    • E_A :(e_pk, a_fk, e, f)
    • B : (b_pk, a_fk, b)
    • E_B : (e_pk, b_fk, e, е)
    • С : (c_pk, b_fk, c)
    • E_C : (e_pk, c_fk, e, f)
    • D : (d_pk, c_fk, d)
    • E_D : (e_pk, d_fk, e, f)
  2. Добавьте fk к E для каждой возможной ассоциации:

    • A : (a_pk, a)
    • B : (b_pk, a_fk, b)
    • C : (c_pk, b_fk, c)
    • D : (d_pk, c_fk, d)
    • E : (e_pk, a_fk, b_fk, c_fk, d_fk, e, f)
  3. Обратное отклонение (этоработает только когда <e> встречается 0-1 раз):

    • A : (a_pk, a, e_fk)
    • B : (b_pk, a_fk, b, e_fk)
    • C : (c_pk, b_fk, c, e_fk)
    • D : (d_pk,c_fk, d, e_fk)
    • E : (e_pk, e, f)
  4. Добавить "паруnt »указывает на E (пример: (2,« A », 1, 69, 42), что означает, что« внешний ключ 1 относится к записи в таблице A с первичным ключом 1 »):

    • A : (a_pk, a)
    • B : (b_pk, a_fk, b)
    • C : (c_pk, b_fk, c)
    • D : (d_pk, c_fk, d)
    • E : (e_pk, parent_table,fk, e, f)
  5. Считайте, что это ассоциация "многие ко многим", и создайте таблицу сопоставления для каждого возможного родителя:

    • A : (a_pk, a)
    • A_E : (a_fk, e_fk)
    • B : (b_pk, a_fk, б)
    • B_E : (b_fk, e_fk)
    • C : (c_pk, b_fk, c)
    • C_E : (c_fk, e_fk)
    • D : (d_pk, c_fk, d)
    • D_E : (d_fk,e_fk)
    • E : (e_pk, e, f)
  6. Что-то еще?

Ничто из этого не кажется идеальным дляя.

1 Ответ

0 голосов
/ 30 января 2016

Может быть 6.

A: (a_pk, a)
B: (b_pk, b)
C: (c_pk, c)
D: (d_pk, d)
E: (e_pk, e, f)

с таблицей ссылок

L: (l_pk, parent_pk, child_pk)
...