c# - 在数据库中保存类类型的最佳方法?

标签 c# database-design types

在数据库中表示“类型”的好方法是什么?

我有一个基类 Action它被许多子类继承。 Action有像Id这样的成员, Name等所有这些对应于数据库中名为 action 的表中的等效列.所以action表格如下所示:

id | name | type 

type列表示它是什么 Action 。在我的代码中,它们对应于从父级派生的子类 Action .现在如何将类的类型保存到数据库中的类型字段

db中的type列可以是任何数据类型。

选项:

  1. 保存 action.GetType().ToString()作为数据库中的字符串。并通过使用反射将类型的字符串表示形式转换为其原始类型,从 db 取回操作类型。 但如果将来类名发生变化,这将是一个问题。

  2. 创建一个枚举来表示每个子类并用 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)创建一个枚举。感觉工作量有点大。

  3. 建立一个独立的<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/

相关文章:

c - 初始化内部带有 union 的结构后为 "incompatible types when initializing type"

当值可以是数组或单个项目时,C# DataContractJsonSerializer 失败

c# - 如何使用正则表达式比较两个列表?

php - 今天、昨天、每月日志的 MySQL 表设置

sql - 对于数小时的操作,数据库设计的好方法是什么?

void 类型参数的 C++ 错误

c# - 绑定(bind)列表的 ObservableCollection

c# - 全双工 Tcp 数据交换 c#

database - 归一化 : im new to db normalisation. 我不知道我的答案是否正确

c - 简单程序将 int16_t 数组转换为 uint16_t