2016-12-07 92 views
-1

考慮一個檯球應用程序。您可能需要的一種模型是Match,其中引用了多個Game對象,其中每個對象都包含該遊戲的評分數據。當然,MatchGame參考Player,因爲你需要知道誰在玩。因此,鑑於這種相對簡單的模型:如何處理引用其他存儲對象的存儲對象?

class Match 
{ 
    Player Player1; 
    Player Player2; 
    List<Game> Games; 
} 

class Game 
{ 
    Player Player1; 
    Player Player2; 

    // ... scoring data 
} 

class Player 
{ 
    string PlayerName; 
} 

我們希望我們的比賽保存到一些存儲(類型是不重要的,但例如,可以說我們存儲JSON序列化對象的斑點在Azure中)。

最簡單的方法,我們可以做到這一點是:

storage.SaveBlob(JsonConvert.SerializeObject(myMatch)); 

但是,這將節省的Player1Player2多個副本 - 一個用於比賽和一個在一場比賽每場比賽。

我們可以改變Game到:

class Game 
{ 
    [JsonIgnore] 
    Player Player1; 

    [JsonIgnore] 
    Player Player2; 

    // ... scoring data 
} 

這解決了我們的重複播放器的問題,但現在我們有一個反序列化將需要Match來解決所有的引用Game對象的數據成員的問題,與任何一起其他類似的對象在更復雜的情況下。

我們可以再次更新Game

class Game 
{ 
    [JsonIgnore] 
    Match Match; 

    [JsonIgnore] 
    Player Player1 => Match.Player1; 

    [JsonIgnore] 
    Player Player2 => Match.Player2; 

    // ... scoring data 
} 

這簡化了問題,但仍需要Match反序列化來解決它的性質。此外,添加這種類型的抽象創建的問題Game對象必須部分Match。從概念上講,情況並非如此(沒有理由不可以讓Game不是完整的Match的一部分),所以這看起來很糟糕。

不同的選項可能會改變Match到:

class Match 
{ 
    Player Player1 => Games.First().Player1; 
    Player Player2 => Games.First().Player2; 
    List<Game> Games; 
} 

這類解決了我們有Player對象的問題,它保存多個類的,但是會造成數據的重複很大。另外,如果我們將所有這些數據保存到存儲中,然後Player更改它們的評級級別,例如,我們通常希望也更新所有引用(有些情況下可能不是這種情況,但現在讓我們忽略)。

目標是在保持一定數量的數據規範化的同時,有乾淨的序列化/反序列化。所以......應該做什麼?這不是一個常見問題嗎?

+0

這是一個非常廣泛的問題,包含許多可能的答案(包括關係數據庫,列數據庫,鍵/值,圖表,文檔等多種類型的數據存儲)以及這些類別中的許多品牌的數據庫。 –

+0

你沒有錯,但有幾個正確答案的問題並不錯。我很高興聽到任何適合這種情況:) – Rollie

回答

-2

這是關係數據庫的好工作。

將實體(匹配,遊戲,玩家)存儲在單獨的表中。

使用「連接」操作檢索它們。

你提出的是重新發明那個已經存在幾十年的車輪。另一方面,它看起來像你正在存儲的歷史數據,這是不會改變的,所以非關係數據庫(NoSQL)可能是你的事情。存儲是非常便宜的,所以不要在這裏和那裏重複一點數據(因爲它不會改變)。

注意:如果您的應用程序可能允許存儲的數據變化,然後複製數據,應該不惜一切代價避免的(所以沒有人更新一個副本,而不是其他人),在這種情況下使用關係模型。

+0

關係模型是好的;數據存儲對於這個問題有點不相關,但可以說我正在使用SQL。接下來的問題是:給定一個Match匹配對象,如何輕鬆地將整個事物保存到數據庫中而沒有數據重複?真正的問題是:給定一個將在數據庫中表示的對象O,但它本身引用也存儲在數據庫中的其他對象,那麼如何一致地保存和加載O,而無需在什麼負載上創建大量類型特定的基礎結構/存儲操作需要。 – Rollie

+0

重複的數據*不*邪惡 - 它被稱爲*非規範化*數據。並達到目的。不應該不惜一切代價避免*。這是一個非常「規範化的關係」的觀點(並且是一種自以爲是的觀點)。 –

+0

另外:我不明白你的斷言,這個數據屬於關係存儲,但如果它是歷史/不變的,那麼它應該進入NoSQL數據庫。爲什麼?以及哪種NoSQL類型:文檔?核心價值?柱?圖形?爲什麼關係在第一位,比如說圖表或文檔? –