2012-03-07 35 views
1

我想使用MySQL和SQLAlchemy(0.7)在SQL表中使用多個鏈接列表。所有帶有父節點的第一個節點的列表都是0,結束於子節點爲0.該id代表列表,而不是indevidiual元素。該單元由PK使用SQLAlchemy和MySQL的多個鏈接列表

認定有了一些省略語法(的問題不相關),它應該是這個樣子:

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

如表有多個鏈接列表如何可以返回從整個列表數據庫我選擇一個特定的ID和父母是0?

例如:

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

我不明白。 'id'是一個特定鏈表或者一個特定元素的唯一標識符嗎?你想提取什麼:列表中的所有元素?或者列表中的所有元素以正確的順序_? – jogojapan 2012-03-07 10:58:38

+0

這個元素是獨一無二的,我會更新這個問題來反映這一點。 – Chrizmo 2012-03-07 11:00:17

+0

在retrospecr;這是一個壞主意,所以身份證明了整個名單。 – Chrizmo 2012-03-07 11:07:09

回答

0

既然你有存儲在同一個表的多個鏈接列表,我假設你存儲無論是頭部和/或那些在某些其他表的尾部。一些想法:

1)保持鏈表:從數據查詢的角度 第一個大的改善(在評論中還提出),將有一些共同的標記(讓稱它爲ListID)的所有節點在同一個列表中。這裏有幾個選項:

  • 如果每個列表從一個對象(數據行)只引用[我甚至短語,如「是否列表屬於單個對象的問題?],然後這個ListID可以簡單地作爲持有者對象的(主要)標識符,其頂部爲ForeignKey以確保數據的完整性 在這種情況下,查詢所有列表非常簡單,事實上,您可以定義relationship並像my_object.my_list_items一樣導航它。
  • 如果列表被多個對象使用/引用,那麼可以創建另一個R表將只包含一列ListID (PK),每個節點/項目將再次有一個ForeignKey到它,或類似
  • 別的東西,大的列表可在兩個查詢/ SQL語句被載入:
    1. 查詢頭/尾由其ID
    2. 查詢基於整個列表接收到的HEAD的ListID/TAIL
      事實上,這可以用諸如下面的一個一個查詢(單查詢示例),這是比較來進行從IO角度來看是有效的,但是分兩步做就有一個好處,那就是您立即引用了HEAD(或TAIL)節點。

單查詢例如:

# 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) 

IIN任何情況下,爲了遍歷鏈表,你必須通過它的ID來獲得頭/尾,然後遍歷照常。
注意:在這裏,我不確定SA是否會認識到引用對象已經加載到會話中,或者將爲其中的每一個發出其他SQL語句,這將破壞批量加載的目的。


2)Ordering List擴展替換鏈表:
請閱讀Ordering List文檔。這很可能是Ordering List的實現將足夠讓你使用,而不是鏈接列表

+0

感謝您的反饋,在我的交談之後@jogojapan早些時候我改變了每個列表元素的標識。說到HEADS和TAILS,這是0,它是不可變的,並在同一張表中。列表標識的方式就像你如何使用包含我稱之爲meta的信息的單獨表格。似乎我們有類似的想法。 – Chrizmo 2012-03-09 09:18:49

+0

@Chrizmo:你在PK = 0的表中有一排嗎?或者你不強制實施ForeignKey約束? – van 2012-03-09 09:27:37

+0

我強制ForeignKey約束,我有PK = 0。 – Chrizmo 2012-03-09 10:13:02