继承数据库的最佳方式

时间:2017-01-17 13:46:07

标签: c# sql-server inheritance

假设我有这些类

public class Animal {
    public int AnimalID;
    public bool HasFeet;
}

public class Dog {
    public int AnimalID;
    public int DogID;
    public bool HasOwner;
}

public class Cat {
    public int AnimalID;
    public int CatID;
    public bool LovesSleeping;
}

这些类正在镜像数据库表。 获得的最佳解决方案是什么?只有动物ID的猫?检查Table Dog是否有一个我正在寻找的AnimalID,然后对Table Cat做同样的操作将是完全无效的。

如何使用最佳解决方案来查看类和数据库?

感谢您的帮助

编辑:

经过一些评论后,我看到我可以这样实现:

public class Animal {
    public int AnimalID;
    public bool HasFeet;
}

public class Dog : Animal {
    public bool HasOwner;
}

public class Cat : Animal {
    public bool LovesSleeping;
}

但现在我想知道我是否只有AnimalID,我怎么能用Linq2Sql获取Cat?

通常我会做类似

的事情
public static Animal Get(DataContext db, int animalID) {

    IQueryable<Animal> query =
    from animal in db.GetTable<Animal>()
    where animal.AnimalID == animalID
    select animal;

    return query.Single();
}

这会给我一个动物,但不是猫我猜,对吧? 那么如果我不知道,我怎么会得到猫?AnimalID是一只猫?

1 个答案:

答案 0 :(得分:1)

通过像这样建模您的数据,您正在建立Id关系。但正如你已经说过的,你不知道public class Animal { public int AnimalID; public bool HasFeet; } public class Dog : Animal { public bool HasOwner; } public class Cat : Animal { public bool LovesSleeping; } 属于哪个表格。

table Animal
------------
int Id (PK)
int Type
bit HasFeet

table Dog
---------
int Id (PK)
int AnimalId (foreign key to Animal.Id)
bool HasOwner

table Cat
---------
int Id (PK)
int AnimalId (foreign key Animal.Id)
bool LovesSleeping

因此,您可以为此关系设置如下表格:

Has-A

当你应用这个逻辑虽然它变成了Animal逻辑,但这并不会伤害你的要求。因此,您只能调用Type表,从中获取{{1}},并针对相关表格进行下一次查询,以获得正确的动物类型。这样您仍然可以进行2次查询,但在向应用程序添加新类型时,它不会增加。因此,这种设计也支持开放式委托人。