2011-03-29 21 views
2

通常,當您有一個具有selfrefernece的表(例如樹中)時,您有一個屬性作爲外鍵,它指向表的主鍵。 (如在從文檔的Adjacency List Relationships例子)SQLAlchemy中的物化鍵

然而,我有一個天然的鍵,它的工作原理是這樣的: 「」是根

  • 「一」,「B」,「C」 「ab」,「ac」等是「a」的孩子
  • 「ba」,「bb」,「bc」等是孩子的孩子。 「b」的兒童
  • 「aaa」,「aab」,「aac」等是「aa」的子女

因此,樹中每個級別都有一個字符,每個節點的子節點都是那些具有相同開始和添加一個字符的字符。這被稱爲「物化鑰匙」

我該如何使用SQLAlchemy映射器而不添加額外的屬性來引用父項?

注:我只是在閱讀關係感興趣,如果像node.children.append(child)這樣的東西不工作,那很好。此外,我堅持版本0.4.8,但如果這是不可能在這個版本,但只有在一個較新的版本,我可能會努力更新。

編輯 我已經得到了關於SA mailinglist的第一個答案。它的工作原理,但它不是基於映射器,因爲我希望它是(例如使用eagerload)

回答

1

我明白這個問題的約束,但爲什麼你試圖避免有一個額外的密鑰?當然,這是多餘的信息,但根據您的數據(行數,密鑰的平均長度),使用額外的密鑰實際上可以提高您在SELECT上的性能,並且您可以使用急切加載SA中的關係以最微不足道的方式。

例如,你可以做到以下幾點:

  • 添加另一個數字標識符PK,並在此鏈接的父/子。
  • 添加另一個字符串標識符以指向父對象(鍵:Varchar,ParentKey:Varchar)。在某些RDBMS(如MSSQL)中,您可以使用PERSISTENT COMPUTED列,這樣您的客戶端甚至不必提供父密鑰,並且它將使用公式自動從KEY列計算(剪切最後一個字符)。在這種情況下,你在這個列上有一個DB索引,並且有很快的關係檢索。
+0

那麼我不希望這樣做的原因很多,因爲我認爲效率會降低,而且我必須保存數十億個實體。然而,計算密鑰的想法可能是一個好主意。我必須看看是否可以使用PostgreSQL 9創建這樣的東西。 – Mene 2011-04-12 11:47:01

+0

清除。我想知道,如果SQL是持久性存儲的正確類型... – van 2011-04-12 12:14:36

+0

也許不是,但現在我必須忍受; D – Mene 2011-04-12 13:18:02