【问题标题】:How to handle storage objects referencing other storage objects?如何处理引用其他存储对象的存储对象?
【发布时间】:2016-12-07 04:10:46
【问题描述】:

考虑一个台球应用程序。您可能需要的一种模型是Match,它引用了多个Game 对象,每个Game 对象都包含该游戏的得分数据。当然,MatchGame 都引用了Player,因为你需要知道谁在玩。所以给定这个相对简单的模型:

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

class Game
{
    Player Player1;
    Player Player2;

    // ... scoring data
}

class Player
{
    string PlayerName;
}

我们希望将匹配保存到某个存储中(类型并不重要,但例如,假设我们在 Azure 中存储 JSON 序列化对象的 blob)。

我们可以这样做的简单方法是:

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 更改它们的评级级别,例如,我们通常希望也更新所有引用(在某些情况下这可能不是这种情况,但让我们暂时忽略)。

目标是在保持一定数量的数据规范化的同时进行干净的序列化/反序列化。那么……应该怎么办?这不是常见问题吗?

【问题讨论】:

  • 这是一个非常广泛的问题,有许多可能的答案(有多种类型的数据存储可用 - 关系、列、键/值、图形、文档)以及这些类别中的许多品牌的数据库。跨度>
  • 你没有错,但有几个正确答案的问题也不错。我很高兴听到任何适合这种情况的消息:)

标签: c# json azure serialization


【解决方案1】:

这对于关系数据库来说是一项很好的工作。

将实体(比赛、游戏、球员)存储在单独的表中。

使用“加入”操作检索它们。

您的提议是重新发明已经存在数十年的轮子。

另一方面,您似乎正在存储历史数据,这些数据不会改变,因此非关系型数据库 (NoSQL) 可能适合您。存储非常便宜,所以不要担心到处重复数据(因为它不会改变)。

注意:如果您的应用程序可能允许更改存储的数据,那么重复数据是邪恶的,应该不惜一切代价避免(因此没有人会更新一个副本而不是其他副本),请使用关系这种情况下的模型。

【讨论】:

  • 关系模型没问题;数据存储与此问题有些无关,但可以说我使用的是 SQL。那么问题来了:给定一个Match 对象,你怎么能轻松地将整个东西保存到数据库中而不重复数据呢?真正的问题是:给定一个要在数据库中表示的对象 O,但它本身引用也存储在数据库中的其他对象,如何在不创建大量特定于类型的基础架构的情况下一致地保存和加载 O /store 操作需要。
  • 重复数据不是邪恶的——它被称为非规范化数据。并且有目的。并且应该不惜一切代价避免。这是一种非常“规范化的关系”观点(并且是一种固执己见的观点)。
  • 另外:我不明白你断言这些数据属于关系存储,但如果它是历史的/不变的,那么它应该进入 NoSQL 数据库。为什么?以及哪种 NoSQL 类型:文档?核心价值?柱子?图形?为什么首先是关系而不是图形或文档?
猜你喜欢
  • 2021-09-16
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多