【问题标题】:MySQL DB: Nullable bool in database column, enum, or two boolean columns, which one is more efficient?MySQL DB:数据库列、枚举或两个布尔列中的可空布尔值,哪一个更有效?
【发布时间】:2015-07-21 21:35:17
【问题描述】:

我首先使用 MVC 5 编写 EF 6 代码。我的一个类的属性可能意味着三件事:

  • 用户确认
  • 还没有回答
  • 已被用户拒绝

我的问题是,我应该使用什么?

  1. 一个可以为空的布尔值,显然映射到上面的选择
  2. 一个枚举(该列将一个整数作为外键存储到另一个列出状态的表中)
  3. 或两个 bool 列(HasAnswered、IsConfirmed),其中 IsConfirmed 仅在用户已回答时才被访问

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

【问题讨论】:

  • 我建议您使用选项 2,是否使用 Enumerators 以提高可读性是您自己的选择,但它确实使代码更具可读性,尤其是当您不希望不断添加新状态时。

标签: mysql entity-framework asp.net-mvc-5


【解决方案1】:

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

以上都不是。

  • 一个枚举..如果想为每个状态添加更多数据或重命名一个怎么办?
  • Nullable bool .. 同上,加上如果你需要添加另一个状态怎么办?
  • 两个 bool 列.. 与上面相同,另外您可以引入规范化问题。

我会选择 tiny_int 称为状态(或类似的东西)。

主要是为了灵活性.. 如果您需要数据库中的状态标题或需要向每个选项添加任何其他数据,您可以将其放在另一个表中并将其外键输入。如果您不需要,您只需要翻译某处的数字。

另一种选择是将动作(答案)从状态中分离出来。

考虑一个答案表,其中包含指示确认或拒绝的列以及对原始表的引用。通过加入表格,可以将没有答案的原始行和已确认/拒绝的行分开。

更新

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

状态数据库表:

id, title, description, priority, cost... (attach extra data to the status)

或者在 PHP 伪代码中(没有表格):

$query = new Query('SELECT * FROM table WHERE status = :status');
$query->bind('status'=>TableClass::STATUS_ANSWERED)

我并不是建议你在任何地方翻译这些数字......只是在某个地方。

int 的最后一个优点是将意义与工作分开。如果我想重命名其中一个enums 怎么办?我使用外键更改了一行,或者可能使用enum 更改了数百万行。

【讨论】:

  • 他描述的枚举正是你所描述的,但他只是希望它也能在他的代码中组织起来,这样他就不会编写类似于 order.StatusId = 3 的不可读代码或编写冗余代码cmets 来解释在给定上下文中到底 3 代表什么。
  • @Null 查看更新。可读性很容易实现。我之前在项目中尝试过使用枚举,但最后总是改变它们
  • “一个枚举......如果想为每个状态添加更多数据或重命名一个” - 这就是你所说的,这就是我的回答。做出一个全新的陈述将需要我写一个全新的答案。我不确定你是否知道,但你可以在给定的枚举数后面有一个整数,重命名枚举数不会改变数字。为了说明我的意思,请查看这张图片:i.imgur.com/2BcH2dV.png 它并没有以任何方式反驳你的最新提议,而是表明他确实可以按照你之前的建议使用它们,即使你说他不能。跨度>
  • 哈哈哎呀,我完全误读了这个问题。我认为 OP 建议在数据库中使用枚举(这就是标题所暗示的)。代码中的枚举不是我考虑的东西。我认为如果你有一个单独的表,一个单独的类可能更容易使用很多框架。否则看起来很明智。好点!
猜你喜欢
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2011-10-15
  • 2018-05-18
  • 2020-04-05
  • 2015-10-21
相关资源
最近更新 更多