MySQL DB:数据库列、枚举或两个布尔列中的可空bool,哪一个更有效?

MySQL DB:数据库列、枚举或两个布尔列中的可空bool,哪一个更有效?,mysql,entity-framework,asp.net-mvc-5,Mysql,Entity Framework,Asp.net Mvc 5,我先用MVC5编写EF6代码。我的一个类有一个属性,它可以表示三件事: 用户确认 他还没有回答 被用户拒绝 我的问题是,我应该用什么 一个可为空的bool,显然映射到上面的选择 枚举(列将把一个整数作为外键存储到另一个列出状态的表中) 或者两个bool列(HasAnswered,IsConfirmed),其中只有在用户已应答的情况下才能访问IsConfirmed 我非常感谢您的每一个意见。免责声明。。我以为您建议将枚举作为列数据类型 以上都没有 枚举。。如果要为每个状态添加更多数据或重命名

我先用MVC5编写EF6代码。我的一个类有一个属性,它可以表示三件事:

  • 用户确认
  • 他还没有回答
  • 被用户拒绝
我的问题是,我应该用什么

  • 一个可为空的bool,显然映射到上面的选择
  • 枚举(列将把一个整数作为外键存储到另一个列出状态的表中)
  • 或者两个bool列(HasAnswered,IsConfirmed),其中只有在用户已应答的情况下才能访问IsConfirmed

  • 我非常感谢您的每一个意见。

    免责声明。。我以为您建议将枚举作为列数据类型

    以上都没有


    • 枚举。。如果要为每个状态添加更多数据或重命名数据,该怎么办
    • 可空布尔。。如上所述,如果您需要添加其他状态,该怎么办
    • 两列布尔。。如上所述,另外您还可以引入规范化问题
    我会选择一个名为status(或类似的东西)的
    tiny\u int

    主要是为了灵活性。。如果您需要数据库中的状态标题,或者需要向每个选项添加任何其他数据,您可以将其放置在另一个表中,并对其进行外键输入。如果你不知道,你只需要把数字翻译到某个地方

    另一种选择是将动作(答案)与状态分开

    考虑一个答案表,其中有一列表示确认或拒绝,以及对原始表的引用。通过连接表,可以分离出没有答案的原始行和已确认/拒绝的原始行

    更新

    作为对Null评论的回应,
    int
    的功能要强大得多

    状态数据库表:

    id, title, description, priority, cost... (attach extra data to the status)
    
    或在PHP伪代码中(无表):

    我不是建议你到处翻译数字。。就在某个地方


    int
    的最后一个伟大之处是它将意义与工作分开。。如果我想重命名其中一个
    enum
    s怎么办?我用外键更改一行,或者用
    枚举更改数百万行

    他描述的枚举正是您所描述的,但他只是希望它也被组织在他的代码中,这样他就不会编写与order.StatusId=3类似的不可读代码,也不会编写多余的注释来解释在给定上下文中3到底代表什么。@Null请参阅更新。可读性相当容易实现。我以前在项目中尝试过使用enum,但最终总是将其更改为“一个enum..如果要为每个状态添加更多数据或重命名一个,该怎么办”-这就是您所说的,这就是我的答案。做一个全新的陈述需要我写一个全新的答案。我不知道你是否知道,但是你可以在给定的枚举数后面有一个整数,重命名枚举数不会改变数字。为了说明我的意思,请回顾一下这张图片:它并没有以任何方式否定你的最新提议,但表明他确实可以按照你之前的建议使用它们,尽管你说他不能。哈哈,我完全误解了这个问题。。我以为OP建议在数据库中使用枚举(这就是标题所建议的)。我没有考虑代码中的枚举。。我认为如果你有一个单独的表,一个单独的类可能更容易与许多框架。。否则,这看起来是明智的。好点子!我建议您使用选项2,无论您是否使用枚举器以提高可读性,这是您自己的选择,但它确实使代码更具可读性,特别是当您不希望不断添加新状态时。
    $query = new Query('SELECT * FROM table WHERE status = :status');
    $query->bind('status'=>TableClass::STATUS_ANSWERED)