.net 什么';s更好:约束还是FK?用于状态列

.net 什么';s更好:约束还是FK?用于状态列,.net,sql-server,performance,sql-server-2008,entity-framework-4,.net,Sql Server,Performance,Sql Server 2008,Entity Framework 4,我有一个使用Entity Framework 4和SQL Server 2008 R2的.NET应用程序,其中所有数据访问层都将由EF4管理 我有一个用于金融交易的表:交易,其列状态具有可能的值:已打开、已发布、已验证、已关闭。该表在插入、更新和读取过程中始终会被访问。我需要在这张桌子上有更好的表现 标准解决方案是创建一个带有Id(int)、名称(varchar)的事务状态,并在事务与事务状态之间建立关系 但现在,我考虑的是另一种解决方案:只创建列状态(int)的事务表,并创建一个状态仅接受1,

我有一个使用Entity Framework 4和SQL Server 2008 R2的.NET应用程序,其中所有数据访问层都将由EF4管理

我有一个用于金融交易的表:交易,其列状态具有可能的值:已打开、已发布、已验证、已关闭。该表在插入、更新和读取过程中始终会被访问。我需要在这张桌子上有更好的表现

标准解决方案是创建一个带有Id(int)、名称(varchar)的事务状态,并在事务与事务状态之间建立关系

但现在,我考虑的是另一种解决方案:只创建列状态(int)的事务表,并创建一个状态仅接受1,2,3,4的约束。并且,在我的应用程序代码上创建一个枚举,其中Opened=1、Released=2、Verified=3和Closed=4


从性能角度来看,第二种解决方案是更好的替代方案吗

如果您的TransactionStatus是不可变的,并且您只需要一个值(在本例中,是一个与枚举值相关的整数),那么是的,我建议您忘记额外的TransactionStatus表


另一方面,如果您计划将其他信息附加到与您的业务层相关的状态,或者您计划让人们自定义状态,那么它应该是一个实体,因此有一个表。

两者都会很快;约束可能更容易检查,但数据库经过了大量优化,可以非常快速地检查FK冲突

鉴于这两种情况,从维护的角度来看,我更喜欢FK选项

  • 通过DML添加一个新的状态行非常容易,而改变一个(可以说)更难部署的约束,需要DDL
  • 如果需要,您可以使用其他元数据列—例如,代码中的描述,或者软删除日期(用于从UI中删除,而不会使旧数据无效)

如果数据永远不会改变,那么这两种方法都是完全可行的,不会产生任何影响。

您是否希望在查询中返回字符串名称?或者提供任何允许编辑状态名称或添加新名称的管理界面?否,Db中的名称仅供参考。管理界面将只使用状态,不会编辑或创建新的。