2013-10-11 131 views
1

問題選擇SQL許多一對多關係到嵌套PHP對象

我有兩個數據表SEQUENCESORGANISMS其許多一對多關係在表中SOURCES mappend。 SOURCESENTRIES之間也有1米的關係。我會追加一個詳細的結構。

我想要實現的是顯示所有相關生物體和條目的所有序列,其中滿足序列表中的條件。我對如何實現這一點有一些想法,但我需要具有最佳性能的解決方案,因爲每個解決方案都包含50k +條目。

想法一個

選擇屬於同一序列中的SQL一個連接字符串,所有的生物,它在PHP分裂。我不知道,但如何做SQL中的連接。

想法2

選擇具有不同的生物體作爲不同的記錄,以便通過生物體相同的序列,和在PHP後加入其中。雖然這不知何故感覺錯了。

想法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

回答

1

不能取嵌套數組就像直接從一個fla t表結構。但是,如果我找到了你的想法,你想要做的並不是很難實現。

我不明白你爲什麼要連接事件,然後再次拆分它們,這很難維護,可能很慢。

我在這裏看到的兩種方法:

  1. 通過它在PHP中取一次平表使用JOIN一切和循環。這種方法造成了很多重複,但速度很快,因爲您可以在一個查詢中獲取所有數據,然後使用PHP進行處理。

  2. 分別獲取每個實體,隨時循環並獲取下一個層次結構級別。這種方法會比較慢。它從SQL查詢中消除複雜性並且不會獲取重複數據。它還爲您提供更多的自由,讓您循環使用數據以及處理數據。

或者你可能想實際分層數據存儲在一個沒有SQL的方式,在那裏你可以已經存儲了你所提到的陣列結構。

+0

是的,我想到像mongo這樣的nosql數據庫,但不幸的是,我必須留在火鳥,因爲它是'強勁'和'已經存在了幾十年。你的第一個方法與我的第二個想法相符,這對我來說看起來不太合適,但也許我應該嘗試一下。我也想過你的第二種方法,但忘了提及它,謝謝。 – lordvlad

+0

由於裁員,第一種方法聽起來不對,但最終不是創造技術債務,而是速度更快。嵌套數據庫調用也不是很好的做法。獲取特定視圖所需的所有數據,然後處理它。您當然可以兌現表格並從現金中查詢。 – markus