c# - 有没有一种好方法可以将多个相似的数据模型(具有一些独特的属性)包装到数据库中的一个表中?
问题描述
假设我有两个数据模型,它们共享许多相同的属性,但有一些关键区别。例如:
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。总而言之,有什么方法可以避免在我的数据库中为每个物种创建一个表,同时还可以最大限度地减少可空字段的数量?我的直觉是,如果我遇到这个问题,每个物种可能都不同,足以保证被视为一个独特的模型。
解决方案
你应该考虑使用接口,让你给自己留下更好的机会在未来进行扩展。
例如,假设我们有一个名为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
};
推荐阅读
- java - java.lang.ExceptionInInitializerError 引起:android.content.res.Resources$NotFoundException:字符串资源
- javascript - 调整 Flipclock.js 标签
- python - 比较 dicts 但得到结果与源
- powershell - 用于查找用户配置文件并将目录更改为配置文件的 powershell 脚本
- linux - $(stat -c%s file.name 的含义
- graphql - 巢穴 | GraphQL - 如何从多个数据集中解析嵌套对象列表
- r - Rtools40:make 实用程序(bash、make 等)在哪里?
- database - Cassandra best practice to ORDER BY using PRIMARY KEY
- csv - 将逗号分隔的值逐行放入新文件中
- c# - 从 C# 中的字典值中排序并取 N