Рассмотрите приложение для бильярда. Один тип модели, который вы, возможно, захотите, - это Match
, который ссылается на несколько объектов Game
, каждый из которых содержит 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 сериализованных объектов в лазури).
Самый простой способ, которым мы могли бы сделать это:
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