1

問題

2 つのデータ テーブルがSEQUENCESあり、ORGANISMSその多対多の関係は table に mappend されていますSOURCES。と の間にも 1 m の関係がSOURCESありENTRIESます。詳細な構造を追記します。

私が達成したいのは、シーケンステーブル内の条件が満たされた、すべての関連生物とエントリを含むすべてのシーケンスの表示です。これを達成する方法についていくつかのアイデアがありますが、それぞれに 50k 以上のエントリが含まれているため、最高のパフォーマンスを発揮するソリューションが必要です。

アイデア1

SQLで連結文字列と同じ配列に属するすべての生物を選択し、PHPで分割します。ただし、SQLで連結を行う方法はわかりません。

アイデア2

異なる生物を含む同じシーケンスを個別のレコードとして選択し、生物ごとに並べ替え、後でそれらを php.ini で結合します。これはどういうわけか間違っているように感じますが。

アイデア3

ビューを使用します。これに関する任意のアイデアを高く評価

構造

SEQUENCES
  SEQUENCE_ID
  DESCRIPTION

ORGANISMS
  ORGANISM_ID
  NAME

SOURCES
  SOURCE_ID
  SEQUENCE_ID FK to SEQUENCES.SEQUENCE_ID
  ORGANISM_ID FK to ORGANISMS.ORGANISM_ID

ENTRIES
  SOURCE_ID FK to SOURCES.SOURCE_ID
  ENTRY_VALUE

望ましい結果

array(
  array(
    "SEQUENCE_ID" => 4,
    "DESCRIPTION" => "Some sequence",
    "SOURCES" => array(
      array(
        "ORGANISM_ID" => 562,
        "ORGANISM_NAME" => "Escherichia coli",
        "ENTRIES" => array(
          "some entry",
          "some other entry"
        ),
      array(
        "ORGANISM_ID" => 402764,
        "ORGANISM_NAME" => "Aranicola sp. EP18",
        "ENTRIES" => array()
      )
    )
  ),
  array(
    "SEQUENCE_ID" => 5,
    .....
  )
)

PHP5 と FIREBIRD2.5.1

4

1 に答える 1

1

そのようなネストされた配列をフラットなテーブル構造から直接フェッチすることはできません。しかし、私の理解が正しければ、あなたがやりたいことを達成するのはそれほど難しくありません。

物事を連結してから再度分割する理由がわかりません。これは維持するのが難しく、おそらく遅いでしょう。

ここには 2 つのアプローチがあります。

  1. JOIN を使用して一度にすべてをフラット テーブルとして取得し、PHP でループします。このアプローチでは多くの重複が生じますが、すべてのデータを 1 つのクエリで取得してから PHP で処理できるため高速です。

  2. すべてのエンティティを個別にフェッチし、ループして次の階層レベルをフェッチします。このアプローチは遅くなります。SQL クエリから複雑さを取り除き、冗長なデータをフェッチしません。また、データをどのようにループするか、またそれをどう処理するかについて、より自由になります。

あるいは、階層データを SQL を使用しない方法で実際に格納することもできます。ここでは、前述の配列構造を既に格納できます。

于 2013-10-11T09:05:54.867 に答える