考慮一個檯球應用程序。您可能需要的一種模型是Match
,其中引用了多個Game
對象,其中每個對象都包含該遊戲的評分數據。當然,Match
和Game
參考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));
但是,這將節省的Player1
和Player2
多個副本 - 一個用於比賽和一個在一場比賽每場比賽。
我們可以改變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
更改它們的評級級別,例如,我們通常希望也更新所有引用(有些情況下可能不是這種情況,但現在讓我們忽略)。
目標是在保持一定數量的數據規範化的同時,有乾淨的序列化/反序列化。所以......應該做什麼?這不是一個常見問題嗎?
這是一個非常廣泛的問題,包含許多可能的答案(包括關係數據庫,列數據庫,鍵/值,圖表,文檔等多種類型的數據存儲)以及這些類別中的許多品牌的數據庫。 –
你沒有錯,但有幾個正確答案的問題並不錯。我很高興聽到任何適合這種情況:) – Rollie