如果我在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列是一个好主意,尽管之前有人告诉我,为"以防万一"的场景构建是不好的实践
添加ShapeType
列可以添加具有Circle
的ShapeType
的形状,而Circle
表中没有相应的记录。一般来说,您应该在数据库中存储尽可能少的数据,以防止这种不一致的可能性,直到明确需要添加冗余信息。
这样的列确实偶尔会有一些实际的好处,但它们主要应用于当Circle
自己的属性直接存储在Shape
表中时。对你来说,情况并非如此,所以你应该问问自己,它是否真的对你有用。
一般来说,由于您正在进行某种对象-关系映射,因此需要某种方法来区分Circle
和Square
。您可以根据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
以逻辑方式映射到鉴别符列。