gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:53:18 24 4
gpt4 key购买 nike

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

我有一个基类 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com