C# 如果我在c代码中使用继承,我是否需要一个;“类型”;数据库中的列?

C# 如果我在c代码中使用继承,我是否需要一个;“类型”;数据库中的列?,c#,sql,tsql,inheritance,C#,Sql,Tsql,Inheritance,我有三个C类:圆形、方形和形状。圆和正方形都是从形状衍生出来的 在我的数据库中,每个表都有一个表,引用基表以显示它们的继承性 目前,我只接触一个圆或一个正方形,从不直接接触一个形状 但是在我的形状表中,我是否应该存储一个“Type”来显示这个形状是圆形的 我的桌子是这样的 CREATE TABLE [dbo].[Shape]( [Id] [int] IDENTITY(1,1) NOT NULL, [ShapeType] [int] NOT NULL,

我有三个C类:圆形、方形和形状。圆和正方形都是从形状衍生出来的

在我的数据库中,每个表都有一个表,引用基表以显示它们的继承性

目前,我只接触一个圆或一个正方形,从不直接接触一个形状

但是在我的形状表中,我是否应该存储一个“Type”来显示这个形状是圆形的

我的桌子是这样的

    CREATE TABLE [dbo].[Shape](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [ShapeType] [int] NOT NULL,   //This is the column I'm not sure on
        [sides] [int] NOT NULL
然后,我有一个正方形和圆形的表的独特属性


我觉得ShapeType列是一个好主意,尽管之前有人告诉我,为“以防万一”场景构建是一种不好的做法

一般来说,因为您正在进行某种对象关系映射,所以需要有某种方法来区分
正方形
。可以根据形状表中的数据执行此操作(例如,
Radius
vs
Length
不为空)。但是,有一些原因需要一个决定类型的
鉴别器
列:

  • 如果将系统扩展为包含其他形状,例如
    三角形
    ,则可以轻松地向disciminator列添加另一个值
  • 仅仅根据数据可能无法区分一种类型和另一种类型
  • 您经常会在此鉴别器列上查询数据筛选或分组,因此可以对其进行索引以提高性能
我通常会创建一个映射到不同值的枚举:

public enum ShapeKind { Circle = 0, Square = 1 }

public abstract class Shape { 
    public abstract ShapeKind Kind { get; }
}

public class Square : Shape {
    public override ShapeKind Kind { 
        get { return ShapeKind.Square; } 
    }
}

通过这种方式,您可以使用
ShapeKind
以逻辑方式映射到鉴别器列。

一般来说,由于您正在进行某种对象关系映射,因此需要有某种方法来区分
正方形
。可以根据形状表中的数据执行此操作(例如,
Radius
vs
Length
不为空)。但是,有一些原因需要一个决定类型的
鉴别器
列:

  • 如果将系统扩展为包含其他形状,例如
    三角形
    ,则可以轻松地向disciminator列添加另一个值
  • 仅仅根据数据可能无法区分一种类型和另一种类型
  • 您经常会在此鉴别器列上查询数据筛选或分组,因此可以对其进行索引以提高性能
我通常会创建一个映射到不同值的枚举:

public enum ShapeKind { Circle = 0, Square = 1 }

public abstract class Shape { 
    public abstract ShapeKind Kind { get; }
}

public class Square : Shape {
    public override ShapeKind Kind { 
        get { return ShapeKind.Square; } 
    }
}

通过这种方式,您可以使用
ShapeKind
以逻辑方式映射到鉴别器列。

添加
ShapeType
列可以添加
ShapeType
Circle
的形状,而
Circle
表中没有相应的记录。一般来说,您应该在数据库中存储尽可能少的数据,以防止出现这种不一致的可能性,直到明确需要添加冗余信息为止


这样的列确实偶尔会有一些实际的好处,但是当
自身的属性直接存储在
形状
表中时,这些好处大多适用。对你来说,情况并非如此,所以你应该问问自己,它是否真的对你有用。如果没有,我就省去它。

添加
ShapeType
列可以添加
ShapeType
Circle
的形状,而
Circle
表中没有相应的记录。一般来说,您应该在数据库中存储尽可能少的数据,以防止出现这种不一致的可能性,直到明确需要添加冗余信息为止


这样的列确实偶尔会有一些实际的好处,但是当
自身的属性直接存储在
形状
表中时,这些好处大多适用。对你来说,情况并非如此,所以你应该问问自己,它是否真的对你有用。如果没有,我就省去它。

外键用于“has a”关系。不是因为“是一个”。使用形状类型是个好主意。啊,好吧,我只是想了解更多细节。谢谢你的帮助。对于类型列,您有什么建议?NHibernate非常精确地处理了将继承映射到数据库的过程。我将使用“tinyint”作为ShapeType。我在内存消耗方面有点保守。@Liath这是一个现有的系统,我正在尝试扩展它,因此不可能使用nhibernate。外键用于“has a”关系。不是因为“是一个”。使用形状类型是个好主意。啊,好吧,我只是想了解更多细节。谢谢你的帮助。对于类型列,您有什么建议?NHibernate非常精确地处理了将继承映射到数据库的过程。我将使用“tinyint”作为ShapeType。我在内存消耗方面有点保守。@Liath这是一个我正在尝试扩展的现有系统,所以当我的ShapeType作为你的ShapeKind工作时,nhibernate是不可能的。你认为即使我现在没有用那种,最好还是把它放进去好吗?正方形和圆形也有自己的表格。如果正方形和圆形有自己的表格,您根本不需要形状表格?对不起,我已经编辑了上面的示例。形状将有其他双方共享的属性,那么圆形和方形将在我的形状类型用作您的形状绑定时在它们的表中有它们自己的属性。你认为即使我现在没有用那种,最好还是把它放进去好吗?正方形和圆形也有自己的表格。如果正方形和圆形有自己的表格,您根本不需要形状表格?对不起,我已经编辑了上面的示例。形状将有其他共同的属性,然后圆和正方形将在它们的表中有它们自己的属性完美,这正是我想要的!我想知道我的问题是否用词错了。那我现在就同意了!