2016-12-07 98 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类型:文档?核心价值?柱?图形?为什么关系在第一位,比如说图表或文档? –