大量の有用なデータの生成

商品の大規模なデータベースを生成するメカニズムを作成した経験を共有したいと思います。 その助けを借りて、ユーザーは数分で100万件を超える同じレコードを生成できます。



大規模な商品会計システムを作成しました。 商品の数は数百万を超えると約束されており、テーブルに商品を手動で追加するだけでは不十分であることが明らかになりました。 原則として、製品は同じタイプであり、パラメーターのみが異なります。 例:



数千のネジがあります。 「ハードウェア」製品グループには、釘、ボルト、ナット、ワッシャー、ダボも必要です。この例は、名前の構造が複数のフィールドで構成されており、各フィールドにはいくつかの意味があることを示しています。 ネジ名のセット全体が言語であり(言語は多くの行であることを思い出させてください)、この言語は正規表現で記述できます。 通常、質問への回答には正規表現が使用されます。文字列は言語に属しているかどうか。 この場合、逆問題を解決する必要があります。正規表現を使用して、行セット全体を構築するか、言語を生成します。 つまり、ユーザーは次のように入力できます

(|) D (2|3|3,5|4|5|6|7|8|9|10) (10|12|16|20|25|30|40|50|60|80|100) (|) ( | | |)





プログラムは、すべての種類のネジを生成する必要があります。 一部の正規表現は無限言語を記述するため、すべての表現を使用してデータを生成できるわけではないことに注意してください。 たとえば、式[0-9]+



は、負でない整数の言語を表し、無限です。

データを生成するには、2つの方法を使用します。



自動化世代
OpenSource Automationパッケージは、本質的には正規表現であるステートマシンと連携できます。 他の機能の中でも、ライブラリは特定の正規表現に一致する文字列を生成できます。 次の技術的な問題は、すべてのオプションを生成してデータベースに配置することです。

ただし、この方法には、作業の速度という重大な欠点があります。 数千行でうまく機能しますが、数百万のレコードで数時間かかることがあります(主にデータベースへの1行の挿入が遅いため)。 したがって、2番目の方法が開発されました。



正規表現SQL
SQLクエリ(MySQLダイアレクト)を実行するとどうなるか想像してみてください

 select concat('  ', t1.a, '  ', t2.a, '') from ( SELECT '3' as a union select '4' as a ) as t1, ( SELECT '16' as a union select '20' as a ) as t2
      
      





結果は4行になり、すぐにテーブルに挿入できます。

ネジ径3mm長さ16mm
ネジ径4mm長さ16mm
ネジ径3mm長さ20mm
ネジ径4mm長さ20mm


この簡単な例は、SELECTクエリを記述し、INSERTクエリの一部として使用して、目的の行をデータベースに挿入できることを示しています。 このようなSQLを生成するために、単純な正規表現アナライザーを作成しました。 式内の角かっこを選択し、同じオートメーションを使用して角かっこ内のすべての種類の文字列オプションを生成します。 つまり、たとえば

(3|4) (16|20)





プログラムはブラケット3|4



および16|20



の式を選択し、ブラケットの各ペアに対してオートメーションを使用すると、すべての種類の値が生成され、SQLクエリが生成されます。

このようなクエリは、1つのレコードを挿入するよりもはるかに高速で、数秒で数百万行を追加できます。



生成データを制限する
最後の問題が残った。 厚さ2 mm、長さ100 mmのネジを想像してください。 ありません。 パラメータのいくつかの組み合わせを制限するメカニズムが必要でした。 最も簡単な方法は、すべてのパラメーターを取得してtrue / falseを返すスクリプト言語で関数を記述するようユーザーに依頼することです。 しかし、ほとんどの場合、ユーザー側の誤解に会うでしょう。 そのため、ユーザーが必要なパラメーターの組み合わせを選択できるようにピボットテーブルを使用することにしました。その後、SELECTクエリ内のWHERE条件に追加します。



image



この図は、列が展開され、セルが黄色で強調表示されたピボットテーブルを示しています。 青色はデータベースに既に追加されている製品、緑色はまだ追加されていない製品を示します。 木材用のすべての黒いネジが既に追加されており、金属用のすべての亜鉛メッキネジの半分(110/220)が追加されていることがわかります(どのネジを理解するには、概要表の「金属用材料」列を展開する必要があります)。 また、ユーザーは強調表示されており、民生用コードのプラスドライバー用のネジを追加し、マイナスドライバー用の亜鉛メッキを追加する準備をしています。

誤って生成されたデータの削除と既存のレコードの再追加の処理を保証する方法の詳細は省略します。 これは、MySQL(または別のデータベース)での作業の複雑さにさらに関連しており、投稿のトピックに対応していません。

このメカニズムはそれ自体が証明されています。 ユーザーはそれを習得し、仕事で使用することができました。 現時点では、お客様からの最大の商品データベースは5,000万件を超えています。 このボリュームのほとんどは、作業の最初の月に作成されました。



All Articles