0

对不起,如果这个问题太愚蠢或太神经质......但我自己无法弄清楚。所以我想看看其他人是如何处理的。

我的问题是:

我想写一个程序来显示做某事的进度。所以我需要记录它当前处于哪个状态,以便有人可以随时检查它。有两种方法:

  1. 使用两个字段来表示进度状态:stepis_finished

  2. 仅提交一个:step. 例如,如果这件事需要 5 步,则6意味着完成。(0表示未启动?)

比较以上两种方法。

两个领域:

  1. 似乎更清楚了。而最重要的是,从逻辑上讲stepfinished or not是两个概念吗?我不确定。

  2. 如果事情结束了。我们将is_finished字段更改为true(或您喜欢的 1)。但是现在如何处理step字段?加一个,或者只是因为它现在没有意义而不再碰它?

一个领域:

  1. 简单,节省空间。但不是很直观。例如,我们不知道6仅查看此字段的真正含义,因为它可能代表完成或中间步骤。它需要其他信息total step来确定。如果总步数发生变化,这个含义可能不是很稳定(is_finished两场方法中的场不会受此影响)。

那么您将如何处理呢?谢谢!

更新:

我忘记了在上一篇文章中可能有用的一点:

故事是:我们为客户提供基于网络的服务。(此服务有时间限制,例如1年期限) 客户购买后,我们的部署程序准备硬件(虚拟机)并部署一些需要一些时间才能完成的软件。我们想为客户提供进度信息。部署完成后,应通知客户。

数据库设计:

  1. 它需要一个usage state字段来表示running normal, running but owe (expired), stop。令我困惑的是它是否应该包含not deployed yet信息deploying

  2. 进度信息应该包括一些其他信息,例如,start time这样我们就可以知道自开始以来经过了多少时间。但是这个信息不需要持久化,因为只要它完成了我们就不会关心这些信息。所以我决定将这些进度信息存储在一个单独的(临时)表中。然后我认为它需要另一个更持久的表中的另一个字段来判断事情是否完成。那么我们可以将它结合到usage state上面提到的领域吗?

4

2 回答 2

1

这仍然是一个品味问题,但我建议使用单一int字段的第二个选项step。在插入新记录时,初始化将指示“尚未开始”的step0。任何正整数值显然都表示当前步骤。一旦轨迹完成,我将设置stepNULL. 正如您正确指出的那样,此方法确实需要可靠的文档,但我认为它并不太令人困惑

于 2013-01-30T10:32:34.483 回答
1

我更喜欢单场方法,原因如下:

  • (假设您要搜索步骤)您可以仅使用一个简单的索引“覆盖”所有步骤。
  • 如果您想在每个步骤中附加一些附加信息,单字段方法可以轻松地将 FOREIGN KEY 容纳到包含该信息的新表中。
  • 需要的存储空间略少。如今,存储很便宜,但这不是重点——缓存和网络性能才是。

两场方法:

  • (假设您要搜索步骤)可能需要一个“更胖”的复合索引甚至两个索引(这会占用空间、降低缓存效率并导致 INSERT/UPDATE/DELETE 操作的维护成本)。
  • 需要 CHECK 来保护数据库免受“不可能”组合的影响。有趣的是,一些 DBMS 不强制执行 CHECK(我在看着你,MySQL)。
  • 需要稍多的存储空间(因此适合缓存的空间会稍少,占用的网络带宽稍多等)。

注意:如果您选择使用 NULL,这可能会在某些 DBMS 下产生“有趣”的后果(例如,Oracle 不索引 NULL)。

例如,我们不知道 6 的真正含义

这并不重要,只要客户端应用程序知道它的含义。

为应用程序而不是人类设计数据库。

如果总步骤发生变化,这个含义可能不是很稳定

是的,但是如果在现有步骤的“中间”添加新步骤,则双字段方法也有同样的问题。

  • 要么相应地更新表,
  • 或者永远不要更改步长值。例如,如果第 5 步是最后一个,那么尽管新添加的第 6 步具有更大的价值,但会更早考虑 - 您的应用程序(或我提到的附加表)将知道步骤的顺序,即使它们的值没有排序。如果您真的想要“按值排序”而不使用 UPDATE,请执行以下步骤:10、20、30 等,这样您就可以在间隙中插入新步骤(旧的 BASIC 行号技巧)。
于 2013-01-30T23:24:42.363 回答