2013-09-21 37 views
0

我是一名IT學員,我們只在大學學習RDBMS。我想與MongoDB取得聯繫,並開發一個僅用於教育目的的小型視頻遊戲收藏管理器。MongoDB:如何存儲以下關係?

我想擁有的可用平臺,其中存儲的概述。例如

  • PC
  • 的Xbox
  • 的Xbox 360
  • 遊戲機

當在平臺上的

選擇我要查詢匹配的所有條目選定的平臺。

所以我的第一個想法是要集合:平臺與遊戲

平臺:

_id : "PLATFORMID" 
name : platform_one 

遊戲:

_id : "SOMEID" 
name : game_One 
publisher : somePublisher 
platform : PLATFORMID 

我知道這是寫儘可能多的最佳實踐儘可能將其轉換爲文檔,但我認爲在這種情況下它並不理想,因爲要獲得所有可用的平臺,我必須查詢所有遊戲,然後遍歷整個集合並挑選出pl atforms。

隨着我的做法有可能在啓動時僅加載平臺,然後查詢所有的遊戲。

我說得對還是有與MongoDB的一個更好的解決方案?

由於這是使用的NoSql DB,任何幫助或提示我的第一個項目是讚賞。

+0

我想用兩個集合你的建議將正常工作。 – WiredPrairie

+0

另外,假設平臺名稱不太可能改變,我只是建議在第二個集合中使用平臺名稱而不是id。 – viktortnk

回答

0

之前,您將設計模式,我建議閱讀本:http://docs.mongodb.org/manual/core/data-modeling/,因爲它會給你一個很好的想法,什麼蒙戈不同的數據模型。這將爲如何在Mongo做事情奠定堅實的基礎(這與傳統的RDB非常不同)。

蒙戈模式是高度使用情況相關的,並且爲此所述數據結構被緊密地與該程序集成。不要認爲這是完全規範化數據所必需的,這在使用mongo時通常不是正確的方法。另外請注意,一旦這是真的,就有很多不同的模式結構可供選擇,並且通常所需的性能是如何進行選擇的。因此,具有完全相同數據的兩個應用程序可能具有完全不同的數據結構,並且這兩個應用程序對於它們的使用情況都是正確的,並且對於他們使用其他應用程序(如果您仍然喜歡性能)將是不正確的 對於您的具體情況,我會建議將平臺字段放入遊戲文檔。爲了獲得所有的平臺,有幾種方法。 第一個選項:有一個包含所有平臺的集合。這些可以存儲在_id字段中,並且只能是內容,或者您​​可以擁有關於該平臺的其他字段。這些平臺將是獨一無二的,程序邏輯必須保持更新。在爲遊戲集合創建文檔時,應用程序可能僅提供平臺作爲此集合中的選擇列表。這將允許許多客戶在廉價提供的平臺上保持同步。請注意,沒有外鍵,因此程序本身必須保持這些集合同步。 第二種選擇:使用不同的:http://docs.mongodb.org/manual/reference/command/distinct/。這將返回查詢的不同值。在這種特殊情況下:

db.runCommand({不同:「遊戲」,關鍵:「平臺」,查詢:{}})

但是對大集合,以獲得一組靜態數據,這樣可以過於昂貴。因此,如果密鑰相對固定,則最好使用第一個選項。如果密鑰可以在查詢之間進行變異,那麼這個選項是最好的。

最佳, 查理