2017-03-21 111 views
2

這應該可以通過外鍵來實現,但我正在瀏覽文檔,但我似乎無法找到關於外鍵的任何內容。Google Cloud Spanner是否支持任意的多對多關係?

看起來Cloud Spanner支持的惟一一種關係是交織表關係......但老實說,像MongoDB這樣的NoSQL文檔商店已經提供了這麼多。

您如何在Cloud Spanner中實現多對多關係?

編輯:

在我的特定情況下,我想類似Twitter的追隨者一個特點,和「跟隨」是從一個用戶到另一個直接的關係。

我可以看到如何建模這個得到比較有效的查詢,但我不明白我怎麼會從不一致保障系統,即具有引用已被刪除的用戶的關注。

回答

4

雲扳手supports全方位的連接(內,橫,全,左,右)。它允許您創建和查詢多對多關係,就像在標準SQL數據庫中一樣。

但是,僅僅因爲您可以進行這些查詢,並不意味着它們會高效。如果您的查詢需要跨越拆分進行讀寫,那麼您的查詢性能會比較慢,因爲它需要對多個拆分進行讀取和寫入。交叉表可讓您更好地控制磁盤上的數據佈局,從而提高查詢性能。

如果您想創建一個高效的多對多關係,您可以有兩個表與共享公用密鑰上的父表交錯:

Parent key = account_id 
-- Many 1 key = account_id, user_id 
-- Many 2 key = account_id, group_id 

這將使您能夠進行查詢,只需觸摸一個拆分,保持快速,高效和無衝突。

雲扳手也有一個數組類型,這取決於您的使用情況也可能有所幫助。

編輯:應對

我可以看到如何建模這個得到比較有效的查詢,但我不明白我怎麼會維護其引用了用戶的關注,從不一致的系統,即已被刪除。

您可以刪除同一個帳戶中的所有跟隨者記錄刪除突變,作爲交易中的兩個單獨查詢,也可以設置後臺作業在後臺清理它。

而且,在這種情況下,我不能例如有一個Many2被級聯刪除,因爲它在Many1參考已被刪除,對不對?在這種情況下,我能做的唯一級聯刪除是如果我刪除整個Parent。

是的,這是正確的。

+0

嗨,非常感謝你的回答!但是,對於我來說,使用父級交叉表並不會有太大幫助......這是手動優化分割的更多方法。我會用我的具體案例的更多細節來編輯我的問題。 此外,在這種情況下,我不能例如將Many2級聯刪除,因爲它在Many1中的引用已被刪除,對吧?在這種情況下,我能做的唯一級聯刪除是如果我刪除整個Parent。 – brocoli

相關問題