2012-03-07 1 views
1

MySQLとSQLAlchemy(0.7)を使用して、SQLテーブルに複数のリンクされたリストを作成したい。すべてのリストは、親が0の最初のノードであり、子が0で終わっています。idは、独立した要素ではなく、リストを表します。テーブルから、リスト全体を返すことができますどのように複数のリンクリストを持っていたようSQLAlchemyとMySQLで複数リンクされたリスト

id(INT, PK) 
content (TEXT) 
parent(INT, FK(id), PK) 
child(INT, FK(id), PK) 

:要素がいくつか省略構文(問題に関連していない)でPK

によって識別され、それは次のようになります。データベース私は特定のIDを選択し、親は0ですか?例えば

SELECT * FROM ... WHERE id = 3 AND parent = 0 
+0

私は理解できません。 'id'は特定のリンクされたリスト、または特定の要素の一意の識別子ですか?そして、あなたが抽出したいもの:リストのすべての要素?リストのすべての要素が正しい順序で表示されますか? – jogojapan

+0

isは要素に固有のものなので、これを反映するように質問を更新します。 – Chrizmo

+0

retrospecrで;それはIDが全リストを識別するように悪い考えでした。 – Chrizmo

答えて

0

あなたが同じテーブルに格納された複数のリンクリストを持っていることを考えると、私はあなたがHEADおよび/またはいくつかの他のテーブルでは、これらのTAILいずれかを保存することを前提としています。いくつかのアイデア:

1)リンクリストキープ:データ・クエリの観点から、最初の大きな改善は(もコメントで提案されている)、いくつかの共通の識別子が(ListIDそれを呼び出すことができます持っているだろう を)すべての同じリスト内のノード。ここではいくつかのオプションがあります。各リストはオブジェクト(データ行)からのみ参照され

  • 場合は、[Iだろうでもフレーズリストは、単一のオブジェクトにに属しない」などの疑問?]、その後、 この場合、すべてのリストを照会するのは非常に簡単です。実際には、relationshipを定義してmy_object.my_list_itemsのように移動できます。この場合、ListIDは単にホルダオブジェクトの(プライマリ)識別子になることがあります。
  • リストが複数のオブジェクトによって使用/参照されている場合、anothe
    1. クエリ:1列のみListID (PK)、および各ノード/商品で構成されますRテーブルは再び、大規模なリストは、2つのクエリ/ SQL文でロードすることができ、それにForeignKeyのか、あるいは
    2. 似た何かを持っていますそのIDによってHEAD/TAIL
    3. クエリに基づいて、リスト全体
      実際には、これはそれ以上である以下のようなつのクエリ(シングルクエリ例)で行うことができる/ TAIL HEADのListIDを受けIOの観点からは効率的ですが、2つのステップでそれを行うと、すぐにHEAD(またはTAIL)ノードへの参照があるという利点があります。

シングルクエリ例:いずれの場合Iinが

# single-query using join (not tested) 
Head = alias(Node) 
qry = session.query(Node).join(Head, Node.ListID == Head.ListID).filter(Head.ID == head_node_id) 

、リンクリストをトラバースするためには、あなたがして横断し、そのIDによってHEAD/TAILを取得する必要がありますいつものように。
注:参照オブジェクトが既にセッションに読み込まれていることをSAが認識した場合、またはバルクロードの目的を無効にするその他のSQL文を発行することはできません。


2)Ordering List拡張子を持つリンクリストを置き換えます。
Ordering Listドキュメントを読んでください。それはよくOrdering Listの実装は、あなたがリンクリストの代わりに使用するのに十分良いかもしれない

+0

フィードバックをいただきありがとうございます。私の会話の後、@ jogojapan以前は、各リスト要素を変更しました。 HEADSとTAILSに関しては、これは0で、不変で同じテーブルにあります。方法リストは、私がメタと呼んだこの情報を含む別のテーブルを使ってどのように目的を決めたかのように識別されます。私たちにも同様の考えがあるようです。 – Chrizmo

+0

@Chrizmo:このテーブルにPK = 0の行がありますか?または、ForeignKey制約を強制しないでください。 – van

+0

私はForeignKey制約を強制し、私はPK = 0を持っています。 – Chrizmo

関連する問題