Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 添加布尔字段与检查字段是否为空?_Mysql_Database_Database Design - Fatal编程技术网

Mysql 添加布尔字段与检查字段是否为空?

Mysql 添加布尔字段与检查字段是否为空?,mysql,database,database-design,Mysql,Database,Database Design,我们使用的表需要管理员在记录公开之前批准记录。我想知道设计这样一个表最合适的方法是什么,其中主要查询是检索已批准(或尚未批准)的记录 假设查询的列将被索引: 使用布尔字段是否有任何速度优势 检查列是否为NULL是否符合最佳做法 例如: id | title | text | approved_dttm --------------------------------------- 1 | ... | ... | null 2 | ... | ... | 2017-01-01 0

我们使用的表需要管理员在记录公开之前批准记录。我想知道设计这样一个表最合适的方法是什么,其中主要查询是检索已批准(或尚未批准)的记录

假设查询的列将被索引:

  • 使用布尔字段是否有任何速度优势
  • 检查列是否为NULL是否符合最佳做法
  • 例如:

    id | title | text | approved_dttm
    ---------------------------------------
    1  | ...   | ...  | null 
    2  | ...   | ...  | 2017-01-01 00:00:00 ETC
    
    
    SELECT * FROM table where approved_dttm IS NOT NULL; 
    
    vs

    注:我们不需要批准/未批准以外的多个状态。无“需要进一步审查”等。

    1)添加
    approved
    字段只会复制可以从
    approved\u dttm
    中获得的信息,因此从信息角度添加它没有意义

    2) 从索引的角度来看,您可能会认为布尔(嗯,tinyint)字段上的索引比为datetime字段编制索引小。但是,这个索引的选择性很低(只有2个可能的值),因此MySQL在实际选择数据时很可能会忽略这个索引

    总之,我不会添加额外的布尔字段来指示条目是否已批准。

    1)添加
    approved
    字段只会复制可以从
    approved\u dttm
    派生的信息,因此从信息角度添加它没有意义

    2) 从索引的角度来看,您可能会认为布尔(嗯,tinyint)字段上的索引比为datetime字段编制索引小。但是,这个索引的选择性很低(只有2个可能的值),因此MySQL在实际选择数据时很可能会忽略这个索引


    总而言之,我不会添加一个额外的布尔字段来指示条目是否被批准。

    Q:使用布尔字段有任何速度优势吗?

    A:没有

    在这种情况下,使用
    approved
    列与
    approved\u dttm[NOT]NULL
    相比,任何查询都不太可能获得“速度优势”

    虽然approved列的额外字节可以忽略不计(假设它被定义为TINYINT,那么额外的字节实际上不会影响“适合”一个块的行数)。。。该列上的索引将是不可忽略的。这将需要额外的块(空间),并将增加索引项维护的开销

    我们不能排除某些特殊情况,即添加该列会带来好处,但一般来说,根据提供的信息,添加该列不会带来“速度好处”

    (我们在这里搁置了对冗余数据和更新异常的讨论……添加(冗余)
    approved
    列与第三种范式背道而驰,而我们熟悉的格言是“每个属性都依赖于键,整个键,除了键什么都不依赖。所以帮帮我Codd”。)

    Q:检查列是否为空是否违反最佳做法?

    A:没有

    这并不违背我所知道的任何“最佳实践”。
    NULL
    和三值布尔逻辑一直存在(自1970年E.F.Codd首次提出“关系”以来,1977年出现System/R和Oracle,1983年出现DB2,…)

    一些应用程序开发人员可能不喜欢(或不理解)如何处理空值的细微差别。确实,将列定义为NOTNULL可以减轻他们的负担。但在我的书中,“避免处理空值”并不是“最佳实践”


    我们注意到一些数据库实现存在一些怪癖,没有使用索引来满足
    colisnull
    谓词。但这些怪癖通常通过适当定义的索引和精心编写的查询来克服。理解空值及其怪癖并处理它是一种“最佳实践”。

    Q:使用布尔字段有任何速度优势吗?

    A:没有

    在这种情况下,使用
    approved
    列与
    approved\u dttm[NOT]NULL
    相比,任何查询都不太可能获得“速度优势”

    虽然approved列的额外字节可以忽略不计(假设它被定义为TINYINT,那么额外的字节实际上不会影响“适合”一个块的行数)。。。该列上的索引将是不可忽略的。这将需要额外的块(空间),并将增加索引项维护的开销

    我们不能排除某些特殊情况,即添加该列会带来好处,但一般来说,根据提供的信息,添加该列不会带来“速度好处”

    (我们在这里搁置了对冗余数据和更新异常的讨论……添加(冗余)
    approved
    列与第三种范式背道而驰,而我们熟悉的格言是“每个属性都依赖于键,整个键,除了键什么都不依赖。所以帮帮我Codd”。)

    Q:检查列是否为空是否违反最佳做法?

    A:没有

    这并不违背我所知道的任何“最佳实践”。
    NULL
    和三值布尔逻辑一直存在(自1970年E.F.Codd首次提出“关系”以来,1977年出现System/R和Oracle,1983年出现DB2,…)

    一些应用程序开发人员可能不喜欢(或不理解)如何处理空值的细微差别。确实,将列定义为NOTNULL可以减轻他们的负担。但在我的书中,“避免处理空值”并不是“最佳实践”

    我们注意到一些数据库实现存在一些怪癖,没有使用索引来满足
    colisnull
    谓词。但是那些怪癖
    id | title | text | approved | approved_dttm
    ---------------------------------------
    1  | ...   | ...  | 0        | null 
    2  | ...   | ...  | 1        | 2017-01-01 00:00:00 ETC
    
    
    SELECT * FROM table where approved = 1;