XMLデヌタ統合は別の方法です

この蚘事では、「埓来ずは異なる」が非垞に匷力なXML凊理テクノロゞヌに぀いお説明したす。これにより、XMLデヌタをむンポヌトし、その構造を効率的か぀簡単に倉換できたす。 。



䞭間デヌタ亀換フォヌマットずしおのXMLは、特殊な゚ディタヌ、DOMパヌサヌ、XQUERY / XPATH、XSLT、特別なETLモゞュヌルなど、それず連携するためのテクノロゞヌずツヌルの゚コシステムに成長したした。ツヌルキットのこの倚様性ず開発はすべお、むデオロギヌ的に぀ながりたすデヌタだけでなく、特別なXMLデヌタを操䜜するための技術があるこずを確認したした。 これは、別個の「化孊の科孊」であり、別個に「青い箱に保管されおいる物質の化孊の科孊」です。



以䞋に説明する凊理原理により、条件付きの技術の進歩をわずかに「巻き戻し」、特定のXMLツヌルを䜿甚せずにXMLデヌタのほずんどすべおの䜜業を「クリヌンな」DBMSのレベルに転送できたした。 このアプロヌチにより、XMLデヌタの統合ストレヌゞを線成し、必芁な情報にすばやくランダムにアクセスできるようになりたした。 さらに、ETL機胜を普遍的か぀䜎コストで実際にはコヌディングなしで実装するこずが可胜になりたした。



説明されたアプロヌチは、デヌタスキヌムが頻繁に倉曎される倧容量で耇雑な構造のデヌタ゜ヌスで特に優れおいるこずが蚌明されたした。 少量の情報を凊理する必芁がある堎合、および/たたは構造が単玔な堎合-この技術はおそらくこれたで必芁ありたせん。



このテクノロゞヌの適切なデモケヌスは、適切なFTPで利甚可胜な公共調達サヌバヌzakupki.gov.ruからのオヌプンデヌタです。毎日の曎新の量は、新しいバヌゞョンがリリヌスされおから数週間で平均で数ギガバむトたたは数十ギガバむトのXMLファむルですデヌタスキヌマ。



デヌタ構造は法埋の芁件に準拠しおいるため、たずえば、公共調達通知に関する情報は、賌入の皮類に応じお、十数皮類を超えるドキュメントfcsNotificationによっお提瀺されたす電子オヌクションfcsNotificationEF、芋積り䟝頌fcsNotificationZK、単䞀サプラむダヌfcsNotificationEPからの賌入など。

これらの文曞はすべお、同じ基本的な皮類の通知に基づいおいたすが、詳现が異なりたす。そのため、分析の目的で、このすべおの皮類をある時点で「折りたたみ」、「共通分母」にむンポヌトする必芁がありたす。



公的調達デヌタに基づいお、説明されたアプロヌチは正垞に適甚され、効果的に機胜しおいたす。



説明された技術の簡単な段階/芁玠



1 すべおのXMLデヌタを統䞀された構造テヌブルにむンポヌトしたす 。 これは、ドキュメント党䜓をデヌタベヌスに保存するこずではなく、「芁玠名」-「倀」たたは「属性名」-「倀」のペアずしお芁玠ごずにデヌタ芁玠をむンポヌトしたす。 この段階の結果ずしお、ストレヌゞ圢匏ずしおXMLを取り陀き、あらゆる構造のむンポヌトされたすべおのXMLドキュメントのデヌタぞの高速な統合アクセスを取埗したすXQUERY / XPATHはもう必芁ありたせん。



2テクノロゞヌの 2番目の芁玠は、必芁なデヌタを「匕き出す」ための仕様の䜜成です。デヌタを入れる結果のテヌブルを識別し、゜ヌスフィヌルドず結果フィヌルドをマッピングしたす。 この段階は、最初の段階でダりンロヌドされた文曞のサンプルの分析を通じお、文曞のXSDスキヌムに基づいお、およびスキヌムを䜿甚せずに実行できたす。 この段階では、プログラミングや特別なスキルは必芁ありたせん。ここでのメむンツヌルキットはスプレッドシヌトです。



3最終ステップ-仕様2を䜿甚しおプラむマリむンポヌトリポゞトリから必芁な情報を取埗2、「列」ビュヌぞの倉換「ピボット」、および最終的な「分析」圢匏ぞの自動倉換 -分析デヌタりェアハりスに関しお「星」構造のファクトのテヌブル。枬定リファレンスブックディメンションおよび数倀メゞャヌメゞャヌぞのリンクがありたす。



1.プラむマリむンポヌト。



XMLドキュメントは、頂点が名前ず倀のペアであるツリヌず芋なされたす。 したがっお、説明したアプロヌチは非垞に普遍的であり、デヌタのツリヌのような衚珟に適甚できたす。



XMLからデヌタをロヌドするためのテヌブル構造





ツリヌをテヌブルにロヌドするずいうアむデアは非垞に明癜です。 MS SQLには他のDBMSに぀いおは䜕も蚀わず、芋おいたせんそのような組み蟌み機胜がありたす。スキヌマをむンポヌトしないXMLは、いわゆるEDGEテヌブルにむンポヌトされたす。 EDGE圢匏では、芁玠の名前ずその倀は別々のレコヌドに保存されおいるため぀たり、名前は倀の芪レコヌドです、これは必芁なものではありたせん。この圢匏は、以降の操䜜に䜿甚するには䞍䟿です。 さらに、ツリヌのEDGE通信テヌブルには、ParentIDの指瀺を䜿甚しお登録されたす。



芁するに、EDGEテヌブルからデヌタの垌望する衚瀺を䜜成するこずは可胜ですが、芁玠の名前ず倀を「接着」し、各芁玠にXPATHを再䜜成し、階局識別子を䜜成するために少し汗をかかなければなりたせんすぐ䞋に構築する方法に぀いお。 倧量のデヌタを䜿甚する堎合、これらの問題を解決するにはかなりのリ゜ヌスが必芁になりたすが、単䞀のツヌル/蚀語で実行できたす。



より正確な方法は、XMLパヌサヌを䜿甚しおドキュメントツリヌを取埗しほずんどすべおの蚀語および開発環境に䜕らかの実装がありたす、ドキュメントを1回パスするこずで必芁な情報を入力するこずです。



特定の䟋を芋おみたしょう。 デモXMLファむルdeliveryies.xmlおよびreturns.xmlがありたす。 deliveryies.xml配信ファむルには、デヌタがアップロヌドされる期間の開始日ず終了日の最䞊䜍にDeliveriesルヌト芁玠が含たれおいたす。その埌、名前ずサプラむダを持぀補品が瀺されたす。各補品には、配信情報の詳现日付、数量、䟡栌がありたす。



deliveryies.xml
<Deliveries> <PeriodBegin>2017-01-01</PeriodBegin> <PeriodEnd>2017-01-31</PeriodEnd> <Products> <Product> <Supplier>Zaanse Snoepfabriek</Supplier> <ProductName>Chocolade</ProductName> <Details> <Detail> <DeliveryDate>2017-01-03</DeliveryDate> <UnitPrice>10.2000</UnitPrice> <Quantity>70</Quantity> </Detail> </Details> </Product> <Product> <Supplier>Mayumi's</Supplier> <ProductName>Tofu</ProductName> <Details> <Detail> <DeliveryDate>2017-01-09</DeliveryDate> <UnitPrice>18.6000</UnitPrice> <Quantity>12</Quantity> </Detail> <Detail> <DeliveryDate>2017-01-13</DeliveryDate> <UnitPrice>18.7000</UnitPrice> <Quantity>20</Quantity> </Detail> </Details> </Product> </Products> </Deliveries>
      
      







ファむルreturns.xmlreturnsはたったく同じで、ルヌト芁玠のみがReturnsず呌ばれ、詳现には日付を持぀芁玠が異なっお呌び出されたす。



returns.xml
 <Returns> <PeriodBegin>2017-02-01</PeriodBegin> <PeriodEnd>2017-02-28</PeriodEnd> <Products> <Product> <Supplier>Pavlova, Ltd.</Supplier> <ProductName>Pavlova</ProductName> <Details> <Detail> <ReturnDate>2017-02-21</ReturnDate> <UnitPrice>13.9000</UnitPrice> <Quantity>2</Quantity> </Detail> </Details> </Product> <Product> <Supplier>Formaggi Fortini srl</Supplier> <ProductName>Mozzarella di Giovanni</ProductName> <Details> <Detail> <ReturnDate>2017-02-27</ReturnDate> <UnitPrice>27.8000</UnitPrice> <Quantity>4</Quantity> </Detail> </Details> </Product> </Products> </Returns>
      
      







ダりンロヌドしたファむルの名前は別のテヌブルに保存され、そこにあるファむルのコヌドは2006配信ず2007戻りに等しくなりたす。



レシヌバヌテヌブルでは、デモドキュメントの画像は次のようになりたす。



これはすべおではなく、衚の始たりにすぎたせん
Record_ID File_id パス Element_name Element_value 皮類
001 2006 配送 E
001 \ 001 2006 配送\ PeriodBegin 2017-01-01 E
001 \ 002 2006 配送\ 期末 2017-01-31 E
001 \ 003 2006 配送\ 補品 E
001 \ 003 \ 001 2006 配送\補品\ 補品 E
001 \ 003 \ 001 \ 001 2006 配送\補品\

補品\
仕入先 ザヌンセ・スノ゚プファブリヌク E
001 \ 003 \ 001 \ 002 2006 配送\補品\

補品\
補品名 ショコラデ E
001 \ 003 \ 001 \ 003 2006 配送\補品\

補品\
詳现 E
001 \ 003 \ 001 \ 003 \

001
2006 配送\補品\

補品\詳现\
詳现 E
001 \ 003 \ 001 \ 003 \

001 \ 001
2006 配送\補品\

補品\詳现\詳现\
DeliveryDate 2017-01-03 E
001 \ 003 \ 001 \ 003 \

001 \ 002
2006 配送\補品\

補品\詳现\詳现\
単䟡 10.2000 E
001 \ 003 \ 001 \ 003 \

001 \ 003
2006 配送\補品\

補品\詳现\詳现\
数量 70 E




階局識別子Record_IDに぀いおその目的は、すべおの祖先ずの関係に関する情報を保持しながら、ドキュメントツリヌのノヌドに䞀意に番号を付けるこずです。



詳现に぀いおは
同じSQL Serverには、これらの目的に圹立぀、hierarchyidず呌ばれる特別なデヌタ型オブゞェクト拡匵がありたす。



䞎えられた䟋では、ツリヌの各レベルで芁玠カりンタヌを順次連結する、プラットフォヌムに䟝存しない単玔な実装を䜿甚したす。 固定長の郚分文字列を割り圓おるこずで、任意のレベルの祖先の識別子を簡単か぀迅速に遞択できるように、各レベルのカりンタヌを特定の固定深さたでれロで「仕䞊げ」たす。



これがすべおこの段階です。 これで、これらの補品のSQLサブセット、配信甚のパヌツ、たたは単玔なSQLク゚リで返されるパヌツを遞択し、ファむルず芁玠の識別子を介しお互いに関連付けるこずができたす。



倚くの堎合、このアプロヌチは、効率的なデヌタストレヌゞずそれらぞのアクセスの線成に十分であり、以䞋で説明する「高床な」技術は必芁ない堎合がありたす。



実際、ドキュメントの構造の違いに泚意を払わずに、すべおのデヌタを単䞀のリポゞトリに既にロヌドしたした。単玔なSQLク゚リを䜿甚しお配列党䜓から必芁な情報を分離するかなり効果的な方法を取埗したした。



むンデックスやその他のトリックを最適化しない堎合でも、ワンタむムク゚リ甚のXML゜ヌスストレヌゞシステムなどの゜リュヌションのパフォヌマンスは、XMLをファむルに保存したり、特別なデヌタベヌスフィヌルドに曞き蟌んだりする堎合よりもはるかに高くなりたす。 この堎合、各ドキュメントに察しおXPATH怜玢手順新しい解析を意味したすを実行する必芁はありたせん。䞀床実行しおから、保存した結果をかなり単玔なク゚リで静かに䜿甚したす。



ただし
この段階では、 DeliveryDate 、 Quantity、およびUnitPriceが同じテヌブルのフィヌルドになっおいないため、これは3番目のセクションの「ピボット」プロセスずしお説明されおいたす。



次の手順では、これらのXMLドキュメントを、 MovementReports 移動のタむプ-配信たたは返华、ドキュメントルヌトからの開始日ず終了日、 Products 名前ずサプラむダ、 MovementDetails 䟡栌、数量、日付の3぀のテヌブルを含む単䞀のデヌタ構造ぞの倉換を怜蚎したす-結果ずしおの日付フィヌルドは、゜ヌスファむルではフィヌルドの呌び出し方法が異なるにもかかわらず、䞡方の゜ヌスドキュメントで同じになりたす



2.結果テヌブルぞの倉換の仕様の䜜成。



゜ヌスデヌタず結果テヌブルをマッピングするための仕様を䜜成するプロセスを怜蚎しおください。 このような仕様を䜜成するには、䜕か他のものが必芁です。



2.1。 ドキュメントの構造を備えたプレヌトを取埗したす。


さらに凊理を行うには、すべおのXMLドキュメントの詳现な構造が必芁です。そのため、それに基づいお、どのテヌブル構造をすべおに倉換するかを決定できたす。

このタスクに特定のサンプルXMLドキュメントは必芁ありたせん。特定のドキュメントには、他のドキュメントに予期せず衚瀺されるオプション芁玠がない堎合がありたす。



XSDスキヌムがない堎合、たたは連絡したくない堎合は、XMLドキュメントの代衚的なサンプルをテヌブルにアップロヌドし、 PathフィヌルドずElement_Nameフィヌルドでグルヌプ化しお必芁なリストを䜜成すれば十分です。



ただし、最終的にタヌゲットの「最終」テヌブルに情報をロヌドするこずを忘れないでください。そのため、 1察倚の関係がXMLのどこに栌玍されおいるかを知る必芁がありたす。 ぀たり、再生が発生する「嚘」テヌブルを構成する芁玠を理解する必芁がありたす。



文曞のレむアりトがそれほど耇雑でない堎合は、経隓的に「目」ですぐに理解できるこずがありたす。 たた、「代衚サンプル」のデヌタをグルヌプ化するずきに、芁玠の数を蚈算し、これらの統蚈から「乗算」を開始する堎所を確認できたす。 しかし、䞀般的な堎合、通垞のXSDスキヌムがある堎合は、それを䜿甚する方が良いです。XSD構造䜓maxoccurs = unboundedを明らかにするこずにより、デヌタの乗算を「キャッチ」したす。



ご芧のずおり、タスクはもう少し耇雑です。ドキュメントのすべおの芁玠のXPATHパスのリストを含む単玔なラベルだけでなく、デヌタの䌝播が開始される堎所の衚瀺も取埗したいです。 そしお、よく曞かれたXSDスキヌムを分析するずき、玠晎らしいボヌナスは、芁玠ずそのタむプの説明を匕き出すこずができるこずです。



XML゚ディタヌの機胜を䜿甚しおこのようなラベルを取埗するこずは非垞に良いこずですが、XSDスキヌム長い間怜玢され、詊行されたしたに埓っお必芁な文曞構造を提䟛するようなツヌルは芋぀かりたせんでした。



これらのOxygen、Altova、Liquid、および掗緎されおいないものすべおで、必芁な情報は間違いなく䜿甚されおいたすが、正しい圢匏で提䟛するこずはできたせん。 原則ずしお、高床な゚ディタヌでは、スキヌマに基づいおサンプルXMLを生成できたすが、XSDでは、ドキュメントにいく぀かの異なる芁玠から遞択するものが含たれる堎合、 遞択構造が存圚する堎合がありたす。その埌、実際の「戊闘」サンプルドキュメントを分析するこずをお勧めしたす そしおただ-文曞のモデルたたはサンプルによるず、明瀺的な圢匏で1察倚の情報を耇補する瞬間も捉えたせん。



その結果、私は自分で車茪を再発明し、そのようなプレヌト実際には、特別な皮類のXSDパヌサヌのゞェネレヌタヌを䜜成する必芁がありたした。 XSDの利点はXMLでもあり、リポゞトリにロヌドしお、リレヌショナル操䜜で目的のビュヌを匕き出すこずもできたす。 スキヌムが単玔で、耇雑な芁玠タむプを参照せず、基本タむプから継承しない堎合、これは非垞に簡単です。 このタむプの継承がすべお利甚できる堎合たずえば、公共調達の堎合、タスクはより耇雑になりたす。



この䟋では、次のドキュメント構造の衚のようなものを取埗したす。
パス Element_name 最倧発生
配送\ PeriodBegin
配送\ 期末
玍入\補品\補品\ 補品名 補品\補品
玍入\補品\補品\ 仕入先 補品\補品
玍入\補品\補品\詳现\詳现\ DeliveryDate 補品\補品\詳现\詳现
玍入\補品\補品\詳现\詳现\ 数量 補品\補品\詳现\詳现
玍入\補品\補品\詳现\詳现\ 単䟡 補品\補品\詳现\詳现
\を返したす PeriodBegin
\を返したす 期末
返品\補品\補品\ 補品名 補品\補品
返品\補品\補品\ 仕入先 補品\補品
返品\補品\補品\詳现\詳现\ 数量 補品\補品\詳现\詳现
返品\補品\補品\詳现\詳现\ 垰囜日 補品\補品\詳现\詳现
返品\補品\補品\詳现\詳现\ 単䟡 補品\補品\詳现\詳现




2.2。 倉換の説明


ドキュメントの衚圢匏の仕様の圢匏で初期デヌタを受け取ったら、デヌタ倉換の蚭蚈に進みたす。 この倉換の結果ずしお、゜ヌスプラむマリXMLストレヌゞのデヌタを、タヌゲットテヌブルの新しいフィヌルド名ず䞀意のレコヌドコヌドを持぀新しいテヌブルに倉換したす。 特別な゜フトりェアツヌルは必芁ありたせん。このプレヌトにいく぀かの新しい列を远加するだけです。



䞊蚘の䟋では、読みやすくするために䞀郚のフィヌルドが省略されおいたす。
パス Element_

お名前
最倧発生 察象

テヌブル
察象

野原
芁玠

深さ
远加

情報
配送\ PeriodBegin MovementReports PeriodBegin_Date 1 配送
配送\ 期末 MovementReports PeriodEnd_Date 1 配送
配送\ ... \補品\ 補品名 ... \補品 補品 ProductName_Dim 3
配送\ ... \補品\ 仕入先 ... \補品 補品 Supplier_Dim 3
配送\ ... \ ... \ ... \詳现\ DeliveryDate ... \詳现 ムヌブメントの詳现 MovementDate_Date 5
配送\ ... \ ... \ ... \詳现\ 数量 ... \詳现 ムヌブメントの詳现 Quantity_Val 5
配送\ ... \ ... \ ... \詳现\ 単䟡 ... \詳现 ムヌブメントの詳现 UnitPrice_Val 5
\を返したす PeriodBegin MovementReports PeriodBegin_Date 1 返品
\を返したす 期末 MovementReports PeriodEnd_Date 1 返品
返品\ ... \補品\ 補品名 ... \補品 補品 ProductName_Dim 3
返品\ ... \補品\ 仕入先 ... \補品 補品 Supplier_Dim 3
戻り倀\ ... \ ... \ ... \詳现\ 数量 ... \詳现 ムヌブメントの詳现 MovementDate_Date 5
戻り倀\ ... \ ... \ ... \詳现\ 垰囜日 ... \詳现 ムヌブメントの詳现 Quantity_Val 5
戻り倀\ ... \ ... \ ... \詳现\ 単䟡 ... \詳现 ムヌブメントの詳现 UnitPrice_Val 5




远加したフィヌルドは次のずおりです。





この手法は、デヌタ倉換を操䜜するための興味深い可胜性を開きたす。 詳现に進むこずなく、できるこずだけをリストしたす。





倉換仕様プレヌトの準備ができたら、デヌタベヌスにロヌドし、 PathフィヌルドずElement_Nameフィヌルドを䜿甚しおプラむマリリポゞトリに結合したす。



Record_IDフィヌルドの倀ずAdditionalInfoの倀のElementDepthに埓っお「トリミング」されたFile_IDを連結するこずにより 、タヌゲットテヌブルの耇合キヌを圢成したす。



各タヌゲットテヌブルの結合の結果を個別の「䞀時」テヌブルに泚ぎたすデヌタ量に応じお、ク゚リ結果を「オンザフラむ」で䜿甚できたす、次の段階で、「パむプラむン」の最終ナヌティリティがこれらのテヌブルで機胜したす。



耇合キヌに぀いおもう少し、倚分少し繰り返したすが、これは重芁で埮劙な点です。
  • キャストする前に、個々のフィヌルド芁玠のレベルでデヌタセットがありたす。 結果のテヌブルのレコヌド内のフィヌルドを接続するには、察応するフィヌルドが含たれるタヌゲットテヌブルのレコヌドを䞀意に識別する䜕らかの皮類のキヌが必芁です。

  • 階局識別子Record_IDは、ドキュメントアりトラむンの個々の芁玠の「深さ」に応じお、異なる長さにするこずができたす。 ただし、レベルの深化が芁玠の1 察倚の乗算を䌎わない堎合、 Record_IDをElementDepthパラメヌタヌで定矩された最小の十分な深さにトリミングしたす。これにより、タヌゲットテヌブルのすべおのフィヌルドに同じ識別子が確保されたす。 デモドキュメントにはそのような状況はありたせんが、たずえば、 UnitPriceが UnitPrice \ RetailおよびUnitPrice \ Wholesaleの卞売䟡栌ず小売䟡栌の2぀の倀に「分岐」するこずを想像しおください。

  • 倚くのファむルの内容は基本ストレヌゞにあるため、キヌにはFile_ID倀が䞍可欠です。
  • デヌタ倉換の次の段階は、このステップで取埗した「倉換された」テヌブルでのみ機胜し、゚ンドツヌ゚ンドの蚭定システムはありたせん。 名前のサフィックスを枡すフィヌルドの皮類ディメンション/メゞャヌですが、情報を取埗したドキュメントのどのセクションに関する情報も「チェヌンに沿っお」枡す必芁がある堎合がありたす同じ圢匏に゚ンコヌドされたドキュメントを倉換できるこずを思い出しおくださいスキヌム。 この情報を倉換の次の段階に転送するには、倉換AdditionalInfoのオプションパラメヌタヌを䜿甚しお、耇合キヌに「フック」し、必芁なタヌゲットレコヌドの識別に違反しないようにしたす。




この䟋の出力で䜕が起こったのか芋おみたしょう



倉換結果
MovementReports

キヌ タヌゲットフィヌルド Element_value
001; 2006 @配送 PeriodBegin_Date 2017-01-01
001; 2006 @配送 PeriodEnd_Date 2017-01-31
001; 2007 @返品 PeriodBegin_Date 2017-02-01
001; 2007 @返品 PeriodEnd_Date 2017-02-28


補品

キヌ タヌゲットフィヌルド Element_value
001 \ 003 \ 001; 2006 Supplier_Dim ザヌンセ・スノ゚プファブリヌク
001 \ 003 \ 001; 2006 ProductName_Dim ショコラデ
001 \ 003 \ 002; 2006 Supplier_Dim マナミス
001 \ 003 \ 002; 2006 ProductName_Dim 豆腐
001 \ 003 \ 001; 2007 Supplier_Dim パブロワ株匏䌚瀟
001 \ 003 \ 001; 2007 ProductName_Dim パブロワ
001 \ 003 \ 002; 2007 Supplier_Dim Formaggi fortini srl
001 \ 003 \ 002; 2007 ProductName_Dim モッツァレラ・ディ・ゞョノァンニ


MovementDetails

キヌ タヌゲットフィヌルド Element_value
001 \ 003 \ 001 \ 003 \ 001; 2006 MovementDate_Date 2017-01-03
001 \ 003 \ 001 \ 003 \ 001; 2006 UnitPrice_Val 10.2000
001 \ 003 \ 001 \ 003 \ 001; 2006 Quantity_Val 70
001 \ 003 \ 002 \ 003 \ 001; 2006 MovementDate_Date 2017-01-09
001 \ 003 \ 002 \ 003 \ 001; 2006 UnitPrice_Val 18.6000
001 \ 003 \ 002 \ 003 \ 001; 2006 Quantity_Val 12
001 \ 003 \ 002 \ 003 \ 002; 2006 MovementDate_Date 2017-01-13
001 \ 003 \ 002 \ 003 \ 002; 2006 UnitPrice_Val 18.7000
001 \ 003 \ 002 \ 003 \ 002; 2006 Quantity_Val 20
001 \ 003 \ 001 \ 003 \ 001; 2007 MovementDate_Date 2017-02-21
001 \ 003 \ 001 \ 003 \ 001; 2007 UnitPrice_Val 13.9000
001 \ 003 \ 001 \ 003 \ 001; 2007 Quantity_Val 2
001 \ 003 \ 002 \ 003 \ 001; 2007 MovementDate_Date 2017-02-27
001 \ 003 \ 002 \ 003 \ 001; 2007 UnitPrice_Val 27.8000
001 \ 003 \ 002 \ 003 \ 001; 2007 Quantity_Val 4




受け取ったキヌは、タヌゲットテヌブルの察応するレコヌドに含たれるすべおのフィヌルドで同じであるこずに泚意しおください。



3.最終凊理。



3.1。 ピボット


前の倉換の結果、トリプル<キヌ>-<フィヌルド名>-<倀>に分割された初期デヌタを含むタヌゲットテヌブルの「空癜」を受け取ったら、それを倚くのフィヌルドを持぀より銎染みのあるテヌブルに倉換する必芁がありたす。 この倉換のアルゎリズムは明らかです。たず、耇合キヌの倀をグルヌプ化しお、テヌブルの「スケルトン」を取埗し、次に、この「スケルトン」ず、耇合キヌの倀による倉換のテヌブル結果ずの結合を実行したす。 いわば「肉を造る」。



぀たり、フィヌルド名で遞択された倉換結果テヌブルのサブセットを持぀「スケルトン」のN個の化合物を取埗したす。ここで、Nはタヌゲット倉換結果テヌブルのフィヌルド名の数です。



この段階でAdditionalInfoフィヌルドを安党に「䜜成」し、耇合キヌ内で゚ンコヌドしたした。 ここで、この「負担」からキヌを解攟し、AdditionalInfoパヌツを新しいフィヌルドAdditionalInfo_Dimにカットする必芁がありたす。



1぀のフィヌルドのキヌをピボットステヌゞに転送するために、ファむルコヌドずレコヌド識別子を組み合わせたした。 「最終」ストレヌゞの堎合、ファむルコヌドず階局識別子を2぀のフィヌルドに分割し盎すこずをお勧めしたす。結果のテヌブルを盞互にリンクしやすくなりたす。



その結果、私たちはそのようになりたす



ピボットプレヌト
MovementReports

Record_ID File_id AdditionalInfo_Dim PeriodBegin_Date PeriodEnd_Date
001 2006 配送 2017-01-01 2017-01-31
001 2007幎 返品 2017-02-01 2017-02-28


補品

Record_ID File_id Supplier_Dim ProductName_Dim
001 \ 003 \ 001 2006 ザヌンセ・スノ゚プファブリヌク ショコラデ
001 \ 003 \ 002 2006 マナミス 豆腐
001 \ 003 \ 001 2007幎 パブロワ株匏䌚瀟 パブロワ
001 \ 003 \ 002 2007幎 Formaggi fortini srl モッツァレラ・ディ・ゞョノァンニ


MovementDetails

Record_ID File_id MovementDate_Date UnitPrice_Val Quantity_Val
001 \ 003 \ 001 \ 003 \ 001 2006 2017-01-03 10.2000 70
001 \ 003 \ 001 \ 003 \ 001 2007幎 2017-02-21 13.9000 2
001 \ 003 \ 002 \ 003 \ 001 2006 2017-01-09 18.6000 12
001 \ 003 \ 002 \ 003 \ 001 2007幎 2017-02-27 27.8000 4
001 \ 003 \ 002 \ 003 \ 002 2006 2017-01-13 18.7000 20




3.2。 正芏化


次の段階は条件付きで正芏化ず呌ばれたす。すべおのフィヌルドを接尟蟞_Dimに察応するディレクトリぞの参照に眮き換え、接尟蟞_Dateおよび_Valのフィヌルドをそれぞれ日付ず数倀に倉換したす。 必芁に応じお、デヌタ型の他のサフィックスを䜿甚できたすが、これは定説ではありたせん。



_Dimフィヌルドごずに、察応するディレクトリの可甚性を確認しディレクトリがない堎合は䜜成したす、ピボットテヌブルのフィヌルドから新しい倀を远加したす。



プロセスの最埌に、ピボットテヌブルずフィヌルド倀に関する曎新されたリファレンスブックを組み合わせお、デヌタを最終的なストレヌゞ構造に転送したす。



その結果、ファむルコヌド、階局識別子、ディレクトリの倀ぞのリンク、および必芁なタむプに倉換された他のフィヌルドを含むタヌゲットテヌブルを取埗したす。



プロセスの説明を終了するには



各タヌゲットテヌブルの階局識別子により、これらのテヌブルを互いに関連付けるこずができたす必芁に応じお、任意の順序で䞭間リンクを省略できたす。 䞊蚘のように、階局識別子の芁玠のサむズが固定されおいるため、タヌゲットテヌブルをリンクするための匏を簡単に䜜成できたす。



もちろん、必芁に応じお、通垞の自動むンクリメントキヌの倀を介したリンクでテヌブル構造を補完できたす。



(, , ). , , – , .



“” , .



「小さな」デヌタ倉換のためにフィヌルドのマッピングを芏定するこずは可胜です-必芁な欠萜しおいるフラグメントに察しおのみ。䞍足しおいるデヌタを「匕き出し」た埌、䞀連の階局識別子を介しおメむンの凊理枈み配列に簡単に「ピックアップ」できたす。



結論



, , “” ad-hoc.



- ETL task, XML-.



, “” ( ) , XML .



All Articles