1

MySQL データベースから多数の個々のデータを収集し、このデータを XML ドキュメントにシリアル化するプログラムを作成しています。

私の XML ドキュメントには 5 つの基本グループがあり、それぞれに 3 つのサブグループが含まれており、合計で約 100 個のデータを収集しています。

コンテンツ自体は、ショッピング サイトでの注文の詳細です。最初にクエリを実行して、クライアントに送信する必要がある次の注文 ID を返します。次に、この注文 ID を使用して、各データ (住所行 1、住所行 2、購入したアイテムなど) を元に戻します。リレーショナル データベースのさまざまなテーブル。

これはどう考えても面倒くさい。最終的には、必要なデータごとに 1 つの変数が定義された大量のメソッドになり、各変数は、MySQL データベースに対してクエリを実行するメソッドの戻り値と等しくなります。一部のデータには追加のロジックを適用する必要があります (たとえば、一部のデータを消去する必要がある、一部の日付を XML 用に特定の方法でフォーマットする必要がある)。

いくつかのポイント

  • データベース構造やショッピング サイトを作成していないため、変更できません
  • 現在実行中の作業プログラムがあります。これは私が数ヶ月前に書いたプログラムであり、改善するために戻ってきます

以下にコード例を示します。

string valueOne = myMethod("SELECT `valueOne` FROM `tableOne` WHERE `OrderID` = '12345';");
string valueTwo = myMethod("SELECT `valueTwo` FROM `tableOne` WHERE `OrderID` = '12345';");
string valueThree = myMethod("SELECT `valueThree` FROM `tableTwo` WHERE `OrderID` = '12345';");
int valueFour = Convert.ToInt32(myMethod("SELECT `valueFour` FROM `tableThree` WHERE `OrderID` = '12345';"));
string valueFive = myMethod("SELECT `valueFive` FROM `tableThree` WHERE `OrderID` = '12345';");

if(valueFive == "FooBar")
{
    //Do Stuff
}

string valueSix = myMethod("SELECT `valueSix` FROM `tableThree` WHERE `OrderID` = '12345';");
DateTime valueSeven = DateTime.Parse(myMethod("SELECT `valueSeven` FROM `tableFour` WHERE `OrderID` = '12345';"));
string valueEight = myMethod("SELECT `valueEight` FROM `tableFive` WHERE `OrderID` = '12345';");
string valueNine = String.Format("QWERTY - {0} - YTREWQ", myMethod("SELECT `valueNine` FROM `tableSix` WHERE `OrderID` = '12345';"));
string valueTen = myMethod("SELECT `valueTen` FROM `tableSeven` WHERE `OrderID` = '12345';");

        MyClass fooBar = new MyClass()
        {
            valueOne = valueOne,
            valueTwo = valueTwo,
            valueThree = valueThree,
            valueFour = valueFour,
            valueFive = valueFive,
            valueSix = valueSix,
            valueSeven = valueSeven,
            mySecondClass = new MySecondClass()
            {
                valueEight = valueEight,
                valueNine = valueNine,
                myThirdClass = new MyThirdClass() { valueTen = valueTen }
            }
        };

SerializeToXML<MyClass>(fooBar);

想像してみてください。ただし、さらに多くのデータが必要です。はい、機能しますが、乱雑で、保守が難しく、より一般的にはあまり良くありません。

私の質問は、.Net アプリケーションで大量のデータを収集する適切な方法は何ですか?

4

2 に答える 2

2

すぐに、多くのクエリを 1 つのクエリに結合できるように見えます。たとえば、次のものがあります。

string valueOne = myMethod("SELECT `valueOne` FROM `tableOne` WHERE `OrderID` = '12345';");
string valueTwo = myMethod("SELECT `valueTwo` FROM `tableOne` WHERE `OrderID` = '12345';");
string valueThree = myMethod("SELECT `valueThree` FROM `tableTwo` WHERE `OrderID` = '12345';");
int valueFour = Convert.ToInt32(myMethod("SELECT `valueFour` FROM `tableThree` WHERE `OrderID` = '12345';"));
string valueFive = myMethod("SELECT `valueFive` FROM `tableThree` WHERE `OrderID` = '12345';");

これらの個々のクエリを取り除き、単一のクエリを使用します。

SELECT one.valueOne, one.valueTwo, two.valueThree, three.valueFour, three.valueFive
  FROM tableOne one
    INNER JOIN tableTwo two on (two.OrderId = one.OrderId)
    INNER JOIN tableThree three on (three.OrderId = one.OrderId)
  WHERE one.OrderId = '12345';

率直に言って、あなたは他の人にも同じことができそうです。

また、何が機能するのか完全にはわかりませんmyMethodが、クエリでスカラー値を返すだけのように見えます。それを取り除き、DataTable またはオブジェクト コレクションを返すものに置き換えます。そうすれば、必要なすべてのデータを一度に取得できます。

注: 内部結合は、これらのテーブルのすべてが OrderId に基づく値を持つことが予想される場合に機能します。そうでない場合は、常に既存のレコードを持つテーブルから始まる外部結合を実行します。例えば:

SELECT one.valueOne, one.valueTwo, two.valueThree, three.valueFour, three.valueFive
      FROM orders o
        LEFT OUTER JOIN tableOne one on (one.OrderId = o.OrderId)
        LEFT OUTER JOIN tableTwo two on (two.OrderId = o.OrderId)
        LEFT OUTER JOIN tableThree three on (three.OrderId = o.OrderId)
      WHERE o.OrderId = '12345';
于 2012-06-27T16:58:37.073 に答える
1

オブジェクト指向プログラミングを十分に活用していません。 あなたの例から、テーブル間の関係を推測するのは難しいですが、Chris Lively はテーブル間の関係を推測する素晴らしい仕事をしました。あなたはそれをショッピング Web サイトからの注文の詳細として説明しました。確かに、それはいくつかの一貫した関係を意味します。

私はこのように問題に取り組みます:

  • 必要なデータを取得するための最も効率的な統合クエリを開発します。
  • クエリごとに、クラスを作成します。データに合わせてクラスを構成します (「それぞれに 3 つのサブグループが含まれる 5 つの基本グループ」)。
  • 適切な OOP 原則に従い、そのクラスで必要な複雑さを隠します (それが必要な唯一の場所である場合)。
  • 変数とクラスには、よりわかりやすい名前を使用してください。

これにより、はるかに読みやすく、保守しやすく、「きちんとした」コードが得られるはずです。

于 2012-06-27T17:04:25.720 に答える