什么更好:约束或FK?对于“状态”列

时间:2011-12-29 11:58:21

标签: .net sql-server performance sql-server-2008 entity-framework-4

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

我有一个金融交易表:交易,列名为可能值的状态:已打开,已下达,已验证,已关闭。对于插入,更新和读取,将始终非常访问此表。我需要在这张桌子上能够获得更好的表现。

标准解决方案是使用Id(int),Name(varchar)创建 TransactionStatuses ,并在交易 TransactionStatuses 之间建立关系

但是现在,我正在考虑另一种解决方案:仅使用列Status(int)创建 Transactions 表,并创建一个约束,其中Status仅接受1,2,3,4。并且,在我的应用程序代码上创建一个Entensration,其中Opened = 1,Released = 2,Verified = 3,Closed = 4。

从性能角度看,第二种解决方案是更好的选择吗?

2 个答案:

答案 0 :(得分:4)

如果您的TransactionStatuses是不可变的,并且您需要的只是一个值(在这种情况下,是一个与枚举值相关的整数),那么是的,我建议您忘记额外的TransactionStatuses表。

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

答案 1 :(得分:4)

要么快,要么约束可能更容易检查,但数据库经过大量优化,可以非常快速地检查FK违规。

考虑到这两个,我更喜欢维护方面的FK选项

  • 通过DML添加新状态行非常容易,而且更改了(可以说)更难部署的约束,需要DDL
  • 如果需要,您可以获得其他元数据列的好处 - 即与代码一起使用的描述,以及可能的软删除日期(用于从UI中删除,而不会使旧数据无效)

如果数据永远不会更改,那么这两种方法都是完全可行的,不会有任何偏见。