首页 > 解决方案 > 有没有一种好方法可以将多个相似的数据模型(具有一些独特的属性)包装到数据库中的一个表中?

问题描述

假设我有两个数据模型,它们共享许多相同的属性,但有一些关键区别。例如:

public class Tiger 
{
  public long Id;
  public string Color;
  public List<Animal> Prey;
}

public class Mouse
{
  public long Id;
  public string Color;
  public List<Animal> Predators;
}

我想将这两个模型都添加到我的数据库中,但理想情况下我只有一个代表所有动物的表(而不是鼠标表、老虎表等)。但是,我也希望能够存储每个的独特属性。我知道一个选项是类似于以下内容的基类:

public class Animal
{
  public long Id;
  public string Color;
  public SpeciesTypes Species;
  public List<Animal>? Predators;
  public List<Animal>? Prey;
}

public enum SpeciesTypes
{
  Mouse = 1;
  Tiger = 2;
}

但是,如果可能的话,我想避免使用一堆可为空的字段,以防我创建更多具有独特属性的 SpeciesType。总而言之,有什么方法可以避免在我的数据库中为每个物种创建一个表,同时还可以最大限度地减少可空字段的数量?我的直觉是,如果我遇到这个问题,每个物种可能都不同,足以保证被视为一个独特的模型。

标签: c#

解决方案


你应该考虑使用接口,让你给自己留下更好的机会在未来进行扩展。

例如,假设我们有一个名为IAnimal

public interface IAnimal
{
  long Id {get;set;}
  string Color {get;set;}
  SpeciesTypes Species;
}

我们可以使用继承来扩展该接口。interface

所以如果我们想要一个Predator我们可以实现一个这样的接口

public interface IPredator : IAnimal
{
    List<IAnimal> Prey {get; set;}
}

也许有些东西说这种动物被一些捕食者猎杀,所以让我们创造IPrey

public interface IPrey: IAnimal
{
    List<IAnimal> Predators {get; set;}
}

有了它,我们可以在单个数据库或列表中存储任何类型的捕食者、猎物或两者都没有。

IPredator shark = new Shark();
IPrey tuna = new Tuna();

shark.Prey.Add(tuna);
tuna.Predators.Add(shark);

List<IAnimal> animals = {
    shark,
    tuna
};

推荐阅读