与EF一起使用时,SQL中的INT与TinyInt与Char(1)

本文关键字:TinyInt INT Char 中的 SQL 一起 EF | 更新日期: 2023-09-27 18:27:35

我有一个存储小范围状态值的场景(N/0-无访问,p/1-部分,F/2-完整,O/3-其他)。SQL Server中的正确字段类型是什么(与EF 6.x一起使用时)?

根据我的理解,这些选项中的每一个都有自己的优点和缺点(尽管这不是一个完整的集合——也许有人可以添加以使其完整)。在更好的系统(性能和空间的平衡)方面,什么是正确的选择。我们可能需要导出两个选项,一个用于具有几千条记录的表,另一个用于包含大量记录的表。

字符(1):

(+) uses less space on DB
(-) costly while performing comparison if not default collation
(-) converted to string with EF and comparison takes a lot

TinyInt/SmallInt

(+) uses less space on DB
(+) performs better in comparisons (in DB and code)
(-) when used with EF, explicit conversion needed in code
(-) may lead to confusions unless documented and understood clearly (the order)

Int

(+) uses default type system and no conversions required
(+) performs better in comparisons and indexes
(-) uses more space
(-) may lead to confusion

编辑

对于Int类型,我尝试使用枚举来解决使用问题:

    public enum StatusValues
    {
        NoAccess = 0,
        Partial = 1,
        Full = 2,
        Other = 3
    }
    public StatusValues StatusValue
    {
        get { return (StatusValues)Status.Value; }
        set { Status = (int)value; }
    }

与EF一起使用时,SQL中的INT与TinyInt与Char(1)

除非空间非常宝贵,否则通常情况下,您将始终使用与系统自动生成的主键类型相对应的默认大小和类型在SQL Server中,这通常是一个Int,除非您在同一个表中处理超过20亿条记录。

如果使用int,没有人会感到困惑。如果您决定使用状态值的查找表,这将是他们期望的数据类型。

对我来说,这听起来像是你太担心正确的数据类型了。我怀疑无论你选择哪种选择,这都会对事情的总体方案产生切实的影响。

实体框架支持使用枚举,使用枚举可以指定底层类型(int16,32,64、byte等)。使用枚举将为您提供可读代码,同时对空间友好。

由于您的数据在0到3的范围内,因此我建议选择一个基本大小为字节的枚举。

通常越小越好。但你必须考虑到增长,所以16位int是最好的。还要考虑处理器中的字节对齐和总线宽度,可能32或64位int也会执行相同的操作。显然,较小的大小会对SQL产生影响。我认为大多数用户习惯于在EF中键入铸造,所以这应该不是一个大问题。使用枚举使代码更可读,文档更容易查找。。。对于N、P、O、F等的每个枚举值,枚举默认为Int,因此使用它很容易理解