Een XML-bestand parseren in een genormaliseerd databaseschema

Ik heb een XML-bestand dat ik op een genormaliseerde manier in een database wil ontleden. Tabel twee is het idee dat ik had om een ​​one-of-many relatietabel te maken. De naam, titel verandert nooit voor elke bestandsgroep, maar de downloadpaden zullen anders zijn.

tafel 1

id | name        | title                         | download_path
----------------------------------------------------------------------
1  | FileGroup 1 | This is the first file group  | /this/1/1.zip
2  | FileGroup 1 | This is the first file group  | /this/1/2.zip
3  | FileGroup 2 | This is the second file group | /this/2/1.zip
4  | FileGroup 2 | This is the second file group | /this/2/2.zip
5  | FileGroup 3 | This is the third file group  | /this/3/1.zip

XML-bestand


    File Group 1
    <title>This is the first file group</title>
    /this/1/1.zip


    File Group 1
    <title>This is the first file group</title>
    /this/1/2.zip


    File Group 2
    <title>This is the second file group</title>
    /this/2/1.zip


    File Group 2
    <title>This is the second file group</title>
    /this/2/2.zip


    File Group 3
    <title>This is the third file group</title>
    /this/3/1.zip

tafel 2

group_id | file_id
-----------------------------
1        |   1
1        |   2
2        |   3
2        |   4
3        |   5

What is the best way to do this when parsing through the XML. If i put the xml data into an array and foreach through each item, i need to be able to able to group them on the fly and create the relationship in tafel 2. I did have the idea of just creating tafel 1 and then afterwards building the relationship table, but even then then i dont know how best to group them. I have nothing in the xml to say they are grouped other that name and title. Each group can have any number of file download paths.

I do not have any say on the XML-bestand creation. Its all I have to deal with.

1

1 antwoord

Uw tabelstructuur is niet genormaliseerd. U kunt één FileGroup/Title-rij bijwerken zonder de andere rij bij te werken, en dit zou verkeerd zijn. In plaats daarvan moet FileGroup/Title zich in één tabel bevinden en moet FileGroup/download_path zich in een andere tabel bevinden.

Wat betreft het organiseren van de DB op basis van de xml, stel je voor dat je de xml door een knoop analyseert:

$groups = array();
foreach ($Items as $Item) {
   if (!isset($groups[$Item->Name])) {
      $groups[$Item->Name] = array(
         'title' => $Item->Title
         , 'files' => array();
      );
   }
   $groups[$Item->Name]['files'][] = $Item->DownloadPath;
}

De xml in uw voorbeeld is ook ongeldig, dus veel succes met verwerken als dat is hoe het echt is ..

0
toegevoegd
@madphp De tabel staat niet in 2NF. Titel is functioneel alleen afhankelijk van naam. Naam is echter geen kandidaat-sleutel. Dit is in strijd met 2NF.
toegevoegd de auteur Explosion Pills, de bron
bedankt dat je gelijk hebt. Mijn xml is goed, ik heb het bovenstaande voorbeeld snel bewerkt om het eenvoudig te maken. Ive maakte de verandering. Ik zal opnieuw naar het schema kijken.
toegevoegd de auteur madphp, de bron
De bovenstaande tabel is ook de Tweede normale vorm in databasenormalisatie. Ik geef toe dat het beter kan.
toegevoegd de auteur madphp, de bron
Dank je. Ik heb hier nog een vraag in verband hiermee geopend als je er zin in hebt. stackoverflow.com/questions/7933982/xml-parsing-conundrum
toegevoegd de auteur madphp, de bron