Я недавно задал этот вопрос на Сведение 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).
Какой лучший способ исправить это?
Создать несколько таблиц 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)
Добавьте 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)
Обратное отклонение (этоработает только когда <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)
Добавить "пару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)
Считайте, что это ассоциация "многие ко многим", и создайте таблицу сопоставления для каждого возможного родителя:
- 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)
Что-то еще?
Ничто из этого не кажется идеальным дляя.