XMLファイルを正規化されたデータベーススキーマに解析する

私は正規化された方法でデータベースに解析したいXMLファイルを持っています。表2は、1対多の関係表を作成するためのアイデアです。名前、タイトルはファイルグループごとに決して変更されませんが、ダウンロードパスは異なります。

表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ファイル


    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

表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 表2. I did have the idea of just creating 表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ファイル creation. Its all I have to deal with.

1

1 答え

あなたのテーブル構造は正規化されていません。他のファイルグループ/タイトル行を更新せずに1つのFileGroup/Title行を更新できますが、これは間違っています。代わりに、FileGroup/Titleは1つのテーブルにあり、FileGroup/download_pathは別のテーブルにある必要があります。

xmlに基づいてDBを整理すると、ノードごとにXMLを解析していると想像してください:

$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;
}

あなたの例のxmlも無効なので、本当にそれがどうでしょう。

0
追加された
@madphpテーブルは2NFにありません。タイトルは機能的には名前にのみ依存しています。ただし、名前は候補キーではありません。これは2NFに違反します。
追加された 著者 Explosion Pills,
ありがとうございます。私のXMLは良いです、私はすぐに上記の例を簡単に編集しました。 Iveは変化を起こしました。私はスキーマをもう一度見ていきます。
追加された 著者 madphp,
また、上記の表は、データベースの正規化における2番目の正規形です。私はそれがより良いことを認めます。
追加された 著者 madphp,
ありがとうございました。私はこれに関連する別の質問をここに開こうと思っています。 stackoverflow.com/questions/7933982/xml-parsing-conundrum
追加された 著者 madphp,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com