2011-10-27 6 views
-1

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

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

<Item> 
    <Name>File Group 1</Name> 
    <Title>This is the first file group</Title> 
    <DownloadPath>/this/1/1.zip</DownloadPath> 
</Item> 
<Item> 
    <Name>File Group 1</Name> 
    <Title>This is the first file group</Title> 
    <DownloadPath>/this/1/2.zip</DownloadPath> 
</Item> 
<Item> 
    <Name>File Group 2</Name> 
    <Title>This is the second file group</Title> 
    <DownloadPath>/this/2/1.zip</DownloadPath> 
</Item> 
<Item> 
    <Name>File Group 2</Name> 
    <Title>This is the second file group</Title> 
    <DownloadPath>/this/2/2.zip</DownloadPath> 
</Item> 
<Item> 
    <Name>File Group 3</Name> 
    <Title>This is the third file group</Title> 
    <DownloadPath>/this/3/1.zip</DownloadPath> 
</Item> 

表2

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

XMLによって解析する際に、これを行うための最善の方法は何ですか。 XMLデータを配列に入れて各アイテムをforeachすると、それらを素早くグループ化してテーブル2に関係を作成できるようにする必要があります。テーブル1を作成した後、リレーションシップテーブルが、それでもグループ化するにはどうすればいいのか分かりません。 XMLには、名前とタイトル以外のグループに分類されているとは言いません。各グループは、任意の数のファイルダウンロードパスを持つことができます。

私はXMLファイルの作成について言及していません。そのすべて私は対処する必要があります。

答えて

0

テーブル構造が正規化されていません。他のファイルグループ/タイトル行を更新せずに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

ありがとうございます。私のXMLは良いです、私はすぐに上記の例を簡単に編集しました。 Iveは変化を起こしました。私はスキーマをもう一度見ていきます。 – madphp

+0

また、上記の表は、データベースの正規化における2番目の正規形式です。私はそれがより良いことを認めます。 – madphp

+0

@madphpテーブルが2NFにありません。タイトルは機能的には名前にのみ依存しています。ただし、名前は候補キーではありません。これは2NFに違反します。 –

関連する問題