在数据库中表示“类型”的好方法是什么?
我有一个基类 Action
它被许多子类继承。 Action
有像Id
这样的成员, Name
等所有这些对应于数据库中名为 action
的表中的等效列.所以action
表格如下所示:
id | name | type
type
列表示它是什么 Action 。在我的代码中,它们对应于从父级派生的子类 Action
.现在如何将类的类型保存到数据库中的类型字段?
db中的type列可以是任何数据类型。
选项:
保存
action.GetType().ToString()
作为数据库中的字符串。并通过使用反射将类型的字符串表示形式转换为其原始类型,从 db 取回操作类型。 但如果将来类名发生变化,这将是一个问题。创建一个枚举来表示每个子类并用
TypeAttribute
装饰它,类似于:public abstract class Action { public enum Kind { [Type(typeof(ControlAction))] ControlAction = 1, [Type(typeof(UpdateAction))] UpdateAction = 2, etc } public abstract Kind ActionType { get; } } public class ControlAction : Action { public override Kind ActionType { get { return Kind.ControlAction; } } } public class UpdateAction : Action { public override Kind ActionType { get { return Kind.UpdateAction; } } } //etc
这看起来不错,除了我必须为从这里开始的每个类(class)创建一个枚举。感觉工作量有点大。
建立一个独立的
<int, Type>
的静态哈希表|将类与int
联系起来值(value)。 可能有点不可读。
有更好的解决方案吗?
最佳答案
我会从第三种解决方案开始使用哈希表,因为它在设计方面看起来确实更简洁。我会将其管理委托(delegate)给数据库!
毕竟,这不是关系数据库最擅长的,在两个实体(在您的例子中是操作和类型)之间创建关系吗?另一个优点是你最终得到一个规范化的模式(当然,到目前为止,类型表只有一列,即它的名称,但是规范化允许你在将来需要时轻松地向类型添加额外的属性,这就是为什么它作为设计更干净)。
模式应该是这样的:
Action 表
action_id(PK) | name | type_id (int, FK to Type table)
类型表
type_id(PK) | type_name
现在,如果类的名称在未来发生变化,您是安全的(关注您的第一个命题字符串类型)。实际上,您要做的就是更改相应 Type
表行中的 type_name
值,并且您所有的 Action
行仍将链接到该行由 type_id
生成,一旦创建从不改变(这里没问题,因为它不具有任何“业务意义”)。
并且您拥有来自 3(Type
表)的可读格式的哈希表,因为 RDMBS 负责管理哈希表(type_id
PK).
请注意,您不必将类绑定(bind)到对应于 type_id
列的 int
值,而是从 Type
中获取> 通过对照类类型 (type_name
) 查找 type_id
表。
关于c# - 在数据库中保存类类型的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18427546/