如何处理数据库中的字典表

Posted

技术标签:

【中文标题】如何处理数据库中的字典表【英文标题】:How to handle dictionary tables in data base 【发布时间】:2011-04-19 09:03:36 【问题描述】:

例如我有以下领域模型:

class Order 
    public virtual int Id get; protected set;
    public virtual BaseStatus Status get; set;


abstract class BaseStatus 
    public virtual int Id get; protected set;
    public abstract string Name get;


class Approved : BaseStatus 
    public override string Name 
     
          get  return "Approved"; 
    

所以现在我不想拥有两张桌子,OrdersStatuses。 Orders 表将有 StatusId 列。 问题是关于更改订单状态的API。如果我执行以下操作:

order.Status = new Approved();

这将导致在状态表中创建新行。 目前我已经创建了以下助手:

class StatusesFactory 
    ISession session;                

    public StatusesFactory(ISession session)
        this.session = session;
    

    public GetStatus<T> where T : BaseStatus, new() 
         T status = session.QueryOver<T>.SingleOrDefault();

         if(status == null)
              status = new T();
              session.SaveOrUpdate(status);
         

         return status;
    

当我想设置状态时,我正在使用这样的代码:

order.Status = statusesFactory.GetStatus<Approved>();

它似乎工作正常,但没有理由变得复杂。我正在使用 NHibernate,但我认为同样的问题可能适用于任何 ORM。这样做的原因是很容易在空数据库上部署,以便在第一次请求时填充它。

    如何处理字典表? 我的方法是否有我看不到的明显缺点?

    我在这里看到的一个问题是,当我需要获取所有可能的状态时,我无法使用如下代码:

    session.QueryOver().List();

因为尚未创建所有状态。 那你怎么看?

【问题讨论】:

一个枚举不能满足订单状态吗? 【参考方案1】:

好问题...

我认为你的 Approved-class 应该使用单例模式,因为只能有一个 Approved-state ...

所有现有状态与所有可能状态的列表有点困难......可能的状态取决于从 BaseState 继承的类......我不知道如何快速找到那些,因为它们没有驻留在当前程序集中,甚至在加载的程序集中...您应该考虑 BaseStatus 中所有子类单例对象的静态列表...

【讨论】:

以上是关于如何处理数据库中的字典表的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 ERD(表)设计中的“或”关系?

如何处理数据透视表和电源查询中的重复条目以填充到 excel 仪表板中

如何处理 Access 表中的数组

如何处理c#中的错误代码

如何处理特定的 json 文件以获得数据框

Node.js:如何处理在字典中查找同名的不同城市?