具有多个父项的复杂元素的XML到关系映射

时间:2012-03-06 22:01:11

标签: xml orm mapping foreign-keys relational-database

我最近在Flattening XML Data into a database schema with 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,f)
    • C :( 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. 向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)
    • 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. 还有别的吗?

  7. 这些对我来说都不是理想的。

1 个答案:

答案 0 :(得分:0)

可能是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)