【问题标题】:What is the best practice for changing status of a record in database更改数据库中记录状态的最佳做法是什么
【发布时间】:2016-03-29 13:26:45
【问题描述】:

我的应用程序类似于订单跟踪应用程序。

一个订单保存在一个包含 300 件商品的订单表中。如果我们从第一步开始处理整个项目,那么我可以放置一个状态字段,告知该订单处于第一步以跟踪订单并使其可用于下一步。

但是,如果第一步的机器只能处理 150 件商品,那么我不得不提一下,该订单的 150 件商品在步骤 2 中,150 件商品在步骤 1 中。为此,我计划每个都有表格步骤并将数据保存到相应的表中。

订单表:order = 001, items=300 ...

第 1 步表:order = 001,items = 150 ...

第 2 步表:order = 001,items = 150 ...

等等

我的困惑只是我是否做对了。许多用户可能会出现这种情况,他们如何处理?我做得对还是只是使数据库过载。

表格: 下面是我制作的表格结构。 Lot、LotOrder 和 lotorderdetail 表与订单相关,而 WindingMain 和 Dyeing 是步骤。

【问题讨论】:

  • 请给出您的订单和/或订单项目表的结构。有产品参考吗?为什么你会说 150 在第 2 步,因为机器不能处理超过某个限制?对我来说似乎很奇怪,对于某些项目,步骤 1 只是被跳过了。你的问题不清楚。
  • 不,这意味着机器将首先处理 150 件商品,然后将其条目输入系统,该订单的 150 件商品在步骤 1 中处理。然后剩下的 150 个将在 step1 机器中处理。我必须记录 150 被传递到 step2 并且 150 可在 step1 中处理的项目。
  • 您是否只有表中的项目数,而不是每个项目的记录?您能否发布您的表格结构(我之前问过)?
  • 请扩展“这可能是许多用户的情况,他们如何处理?”例如,您是指下订单的用户吗?他们可以通过 SELECT ... WHERE user = user 实现的界面查看他们的订单状态。您可以使用 DBMS 的安全功能来执行此操作。
  • 抱歉耽搁了这么久,@trincot 我已经更新了我的问题。

标签: sql database relational-database


【解决方案1】:

重新步骤

订单表:order = 001, items=300 ...
第 1 步表:订单 = 001,项目 = 150 ...
第 2 步表:order = 001,items = 150 ...

您当前的设计以某些方式代表了某些情况。但是有一个以step为列的表是没有问题的:

// order [order] is for [items] items ...
Order(order,items,...)

// order [order] has [items] items in step [step]
Step(order,items,step...)

这样做的好处是,现在您的查询不仅限于使用文字步骤编号或使用元数据来处理多个步骤。

再用户

如果订单是用户下的,那么你应该添加另一列:

// order [order] placed by user [user] is for [items] items ...
Order(user,order,items,...)

// order [order] placed by user [user] has [items] items in step [step]
Step(user,order,items,step,...)

拥有多列或多行不会“重载” DBMS。这就是它们的设计目的。如果有的话,大多数都对大量表而不是列或行有空间和时间限制。

PS 重新寻找和判断设计

每个表都有一个含义,它是一个谓词:由列名参数化的语句。例如上面的代码 cmets。一行加上一个谓词给出了一个命题:一个陈述。提出真实命题的行进入表中。我们必须找到足够的谓词,每个谓词都有一个基表来表达与应用情况相关的所有内容。

  • 如果多个谓词/表仅相差一个公共值,那么您可以添加一个参数/列并使用单个谓词/表
  • 如果一个复杂的谓词/表可以用更简单的谓词的 AND/JOIN 来更清楚地表达,那么您可以拆分谓词/表
  • 如果您有一个或多个谓词包含相同的表达式,那么您可以定义另一个谓词来更简单地表达原始表达式
  • 您可以定义视图和计算列以避免冗余和矛盾的数据

让我们只关注订单、商品和状况。请注意,仍然很难查询处于步骤中或未处理(或已完成)的部分:

//    order [order] has [items] items in step [condition]
   OR order [order] has [items] items unprocessed AND [condition] = unprocessed
Condition(order,items,condition)

或者能够在所有条件下进行算术运算,而不仅仅是步骤:

//     order [order] has [items] items in step [state]
   OR order [order] has [items] items unprocessed AND [state] = 0
State(order,items,state)

您可以做的另一件事是定义状态在条件和步骤方面的含义:

//  item [item] is in state [state] means
        item [item] is in step [state]
    OR item [item] is unprocessed AND [state] = 0

// order [order] has [items] items in state [state]
State(order,items,state)

您还可以通过视图定义状态。它的定义查询表达式是针对一个表,其谓词正是上面定义的含义。

权衡:您可以为未处理项目和正在进行的项目设置单独的表,在这些项目中查询条件更加困难。或者,您可以为未处理和处理中的项目设置一个表,但定义更复杂。

【讨论】:

    【解决方案2】:

    通常,当您有订单中的商品时,您会得到类似的东西(如果您没有,如果您能解释一下您的数据库结构会非常有帮助):

    项目

    • 身份证
    • 姓名
    • 价格

    订单

    • 身份证
    • customer_id

    order_items

    • id(可选)
    • order_id
    • item_id
    • 数量
    • 价格

    order_items 表包含您的订单的“行”。如果您想记录每个订单行的履行步骤,您可以添加一列step

    例如,我可能要订购 100 支钢笔和 500 支铅笔。您的数据结构将能够反映笔在第 1 步,而铅笔在第 2 步。

    如果您在第 1 步中有一些笔,在第 2 步中有一些笔,您可以将其拆分为两个 order_items。

    关键点是,当您可以使用列代替时,您通常不希望为某事物的不同值(例如步骤)创建一组表。

    【讨论】:

    • 不,你可以说我有 500 支红色铅笔的订单,铅笔应该削尖。假设 step1 正在为铅笔着色,而 step2 正在锐化它。但是上色机一次只能上色 150 支铅笔。给 150 支铅笔上色后,系统应该知道用户可以削 150 支铅笔并给 350 支铅笔上色。
    • 好的,在我建议的结构中,您可以通过拆分 order_items 来做到这一点,因此您的订单将从第 1 步中的 500 支铅笔开始,然后在第 2 步中将有 150 支,在第 2 步中将有 350 支1.
    • 如果您不想像那样弄乱订单,您可以添加一个名为fulfillment 之类的表,其中存储order_item_id、数量和步骤。每当完成某些项目的步骤时,您都可以写一行。这是一种更稳健的方法。
    • 如果您的订单只针对一件事,您会放弃订单表并调用 order_items 订单。
    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 2011-06-04
    • 2015-10-09
    • 2010-09-19
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多