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_IDFile_idパスElement_nameElement_value皮類
0012006配送E
001 \ 0012006配送\PeriodBegin2017-01-01E
001 \ 0022006配送\期末2017-01-31E
001 \ 0032006配送\補品E
001 \ 003 \ 0012006配送\補品\補品E
001 \ 003 \ 001 \ 0012006配送\補品\
補品\
仕入先ザヌンセ・スノ゚プファブリヌクE
001 \ 003 \ 001 \ 0022006配送\補品\
補品\
補品名ショコラデE
001 \ 003 \ 001 \ 0032006配送\補品\
補品\
詳现E
001 \ 003 \ 001 \ 003 \
001
2006配送\補品\
補品\詳现\
詳现E
001 \ 003 \ 001 \ 003 \
001 \ 001
2006配送\補品\
補品\詳现\詳现\
DeliveryDate2017-01-03E
001 \ 003 \ 001 \ 003 \
001 \ 002
2006配送\補品\
補品\詳现\詳现\
単䟡10.2000E
001 \ 003 \ 001 \ 003 \
001 \ 003
2006配送\補品\
補品\詳现\詳现\
数量70E


階局識別子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_
お名前
最倧発生察象
テヌブル
察象
野原
芁玠
深さ
远加
情報
配送\PeriodBeginMovementReportsPeriodBegin_Date1配送
配送\期末MovementReportsPeriodEnd_Date1配送
配送\ ... \補品\補品名... \補品補品ProductName_Dim3
配送\ ... \補品\仕入先... \補品補品Supplier_Dim3
配送\ ... \ ... \ ... \詳现\DeliveryDate... \詳现ムヌブメントの詳现MovementDate_Date5
配送\ ... \ ... \ ... \詳现\数量... \詳现ムヌブメントの詳现Quantity_Val5
配送\ ... \ ... \ ... \詳现\単䟡... \詳现ムヌブメントの詳现UnitPrice_Val5
\を返したすPeriodBeginMovementReportsPeriodBegin_Date1返品
\を返したす期末MovementReportsPeriodEnd_Date1返品
返品\ ... \補品\補品名... \補品補品ProductName_Dim3
返品\ ... \補品\仕入先... \補品補品Supplier_Dim3
戻り倀\ ... \ ... \ ... \詳现\数量... \詳现ムヌブメントの詳现MovementDate_Date5
戻り倀\ ... \ ... \ ... \詳现\垰囜日... \詳现ムヌブメントの詳现Quantity_Val5
戻り倀\ ... \ ... \ ... \詳现\単䟡... \詳现ムヌブメントの詳现UnitPrice_Val5


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


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


倉換仕様プレヌトの準備ができたら、デヌタベヌスにロヌドし、 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_Date2017-01-01
001; 2006 @配送PeriodEnd_Date2017-01-31
001; 2007 @返品PeriodBegin_Date2017-02-01
001; 2007 @返品PeriodEnd_Date2017-02-28

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

MovementDetails
キヌタヌゲットフィヌルドElement_value
001 \ 003 \ 001 \ 003 \ 001; 2006MovementDate_Date2017-01-03
001 \ 003 \ 001 \ 003 \ 001; 2006UnitPrice_Val10.2000
001 \ 003 \ 001 \ 003 \ 001; 2006Quantity_Val70
001 \ 003 \ 002 \ 003 \ 001; 2006MovementDate_Date2017-01-09
001 \ 003 \ 002 \ 003 \ 001; 2006UnitPrice_Val18.6000
001 \ 003 \ 002 \ 003 \ 001; 2006Quantity_Val12
001 \ 003 \ 002 \ 003 \ 002; 2006MovementDate_Date2017-01-13
001 \ 003 \ 002 \ 003 \ 002; 2006UnitPrice_Val18.7000
001 \ 003 \ 002 \ 003 \ 002; 2006Quantity_Val20
001 \ 003 \ 001 \ 003 \ 001; 2007MovementDate_Date2017-02-21
001 \ 003 \ 001 \ 003 \ 001; 2007UnitPrice_Val13.9000
001 \ 003 \ 001 \ 003 \ 001; 2007Quantity_Val2
001 \ 003 \ 002 \ 003 \ 001; 2007MovementDate_Date2017-02-27
001 \ 003 \ 002 \ 003 \ 001; 2007UnitPrice_Val27.8000
001 \ 003 \ 002 \ 003 \ 001; 2007Quantity_Val4


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

3.最終凊理。


3.1。 ピボット

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

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

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

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

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

ピボットプレヌト
MovementReports
Record_IDFile_idAdditionalInfo_DimPeriodBegin_DatePeriodEnd_Date
0012006配送2017-01-012017-01-31
0012007幎返品2017-02-012017-02-28

補品
Record_IDFile_idSupplier_DimProductName_Dim
001 \ 003 \ 0012006ザヌンセ・スノ゚プファブリヌクショコラデ
001 \ 003 \ 0022006マナミス豆腐
001 \ 003 \ 0012007幎パブロワ株匏䌚瀟パブロワ
001 \ 003 \ 0022007幎Formaggi fortini srlモッツァレラ・ディ・ゞョノァンニ

MovementDetails
Record_IDFile_idMovementDate_DateUnitPrice_ValQuantity_Val
001 \ 003 \ 001 \ 003 \ 00120062017-01-0310.200070
001 \ 003 \ 001 \ 003 \ 0012007幎2017-02-2113.90002
001 \ 003 \ 002 \ 003 \ 00120062017-01-0918.600012
001 \ 003 \ 002 \ 003 \ 0012007幎2017-02-2727.80004
001 \ 003 \ 002 \ 003 \ 00220062017-01-1318.700020


3.2。 正芏化

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

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

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

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

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


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

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

(, , ). , , – , .

“” , .

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

結論


, , “” ad-hoc.

- ETL task, XML-.

, “” ( ) , XML .

Source: https://habr.com/ru/post/J325186/


All Articles