Удаление свойств и их наследование - сначала подход кода - PullRequest
1 голос
/ 02 апреля 2020

Итак, я занимался разработкой. NET Базового веб-API-приложения для спортивных результатов, команд, соревнований, матчей ... Вы понимаете, о чем.

Теперь, о чем я не думал, когда создание сущностей заключается в том, что у меня будут разные типы матчей - для каждого вида спорта у матча будут в основном одинаковые свойства, но некоторые будут заданы для вида спорта c. Пример: у баскетбола 4 четверти, у хоккея с шайбой 3 периода, у футбола только 2 половины. Есть еще много примеров, когда модели соответствия для этих видов спорта различаются.

Проблема заключается в том, что изначально я создал только одну модель - Match, которая имеет 2 свойства половинного времени для каждой из 2 команд. То, что я хочу сделать: удалить эти 2 свойства из модели Match и сделать Match базовым классом, который будет наследоваться BasketballMatch, FootballMatch, IceHockeyMatch.

Есть ли способ реструктурировать это, используя код вначале подход без повреждения базы данных? Все совпадения могут быть удалены, если необходимо удалить таблицу и создать новую с правильной структурой наследования.

public class Match
{
    [Key]
    public int ID { get; set; }

    public DateTime Date { get; set; }

    [ForeignKey("Sport")]
    public int SportID { get; set; }

    public Sport Sport { get; set; }

    [ForeignKey("Competition")]
    public int CompetitionID { get; set; }

    public Competition Competition { get; set; }

    [ForeignKey("HomeTeam")]
    public int HomeTeamID { get; set; }

    public Team HomeTeam { get; set; }

    [ForeignKey("AwayTeam")]
    public int AwayTeamID { get; set; }

    public Team AwayTeam { get; set; }

    public int? HalfTimeHomeTeamScore { get; set; }

    public int? HalfTimeAwayTeamScore { get; set; }

    public int? HomeTeamScore { get; set; }

    public int? AwayTeamScore { get; set; }
}

1 Ответ

0 голосов
/ 03 апреля 2020

Это:

public class Match
{
// ...
    public int? HalfTimeHomeTeamScore { get; set; }

    public int? HalfTimeAwayTeamScore { get; set; }

    public int? HomeTeamScore { get; set; }

    public int? AwayTeamScore { get; set; }
}

- это отдельные объекты, MatchPart s, если хотите, и они не относятся к самому совпадению, а должны ссылаться на него по ряду причин:

  • Количество частей матча на матч зависит от типа спорта, а иногда и от турнира (мужские теннисные майоры играют до 5 сетов, везде, например, до 3 сетов);
  • Некоторые части матча являются обязательными, если только матч не отменен полностью, а другие являются необязательными (дополнительное время / штрафы в футболе, t ie перерывы в теннисе). Если конкретный матч был завершен без дополнительных частей, вам просто не нужно создавать записи для них;
  • Существуют части, из которых состоят соответствующие части (опять же в теннисе наборы состоят из игр) , так что вам может понадобиться возможность организовать иерархическую структуру. Вы можете создать отдельную таблицу подкомпонентов или собрать все вместе; Вам решать, оба подхода жизнеспособны, если вы достаточно хорошо знаете SQL;
  • У вас может быть несколько записей очков для одной и той же части матча, в зависимости от типа счета. Например, в футболе это будут голы, свободные / угловые удары, желтые / красные карточки, пенальти и т. Д. c. В теннисе дополнительными типами очков могут быть тузы и двойные ошибки, просто назвать несколько.

Пожалуйста, имейте в виду, что этот список ни в коем случае не является полным. Я просто поцарапал здесь поверхность, так сказать.

Учитывая все это, результирующая таблица может выглядеть следующим образом:

create table dbo.MatchParts (
Id bigint identity(1,1) primary key,
MatchId int not null references dbo.Matches (Id),
-- Match part type lookup, big thing in itself
PartTypeId int not null references dbo.MatchPartTypes (Id),
-- Parent part reference for sub-part records, in case you decide to store them all in one table
ParentPartId bigint null references dbo.MatchParts (Id),
-- Position # of part within match or parent
SequenceNumber smallint not null,
-- Score type lookup
ScoreTypeId int not null references dbo.ScoreTypes (Id),
Score1 smallint null,
Score2 smallint null,
-- Natural key. Depends... on many other design decisions.
unique (MatchId, PartTypeId, ParentPartId, ScoreTypeId, SequenceNumber)
);

Я бы настоятельно рекомендовал начать с углубленного бизнес анализ предметной области. Это может выглядеть просто, но это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...