如果我在c#代码中使用继承,我需要有一个“类型”吗?列

本文关键字:有一个 类型 代码 继承 如果 | 更新日期: 2023-09-27 18:17:16

我有3个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列是一个好主意,尽管之前有人告诉我,为"以防万一"的场景构建是不好的实践

如果我在c#代码中使用继承,我需要有一个“类型”吗?列

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

这样的列确实偶尔会有一些实际的好处,但它们主要应用于当Circle自己的属性直接存储在Shape表中时。对你来说,情况并非如此,所以你应该问问自己,它是否真的对你有用。

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

  • 如果你扩展你的系统,包括其他形状,如Triangle,你可以很容易地添加另一个值鉴别列。
  • 仅根据数据可能无法区分一种类型和另一种类型。
  • 您将经常在此鉴别符列上查询数据过滤或分组,因此您可以索引它以提高性能。

我通常做的是创建一个映射到不同值的enum:

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以逻辑方式映射到鉴别符列。

相关文章: