更改数据库中记录状态的最佳做法是什么?

时间:2015-12-23 06:46:57

标签: sql database relational-database

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

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

但是如果第一步的机器只能处理150个物品,那么我必须提到该订单的150个项目在步骤2中,150个项目在步骤1中。为此我计划每个项目的表格步骤并将数据保存到相应的表格。

订单表:订单= 001,料品= 300 ......

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

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

等等

我的困惑只在于我是否正确行事。这可能是许多用户以及他们如何处理这种情况的情况?我做得对还是只是重载数据库。

表格: 下面是我的表结构,我已经做了。 Lot,LotOrder和lotorderdetail表与订单相关,WindingMain和Dyeing是步骤。 enter image description here

2 个答案:

答案 0 :(得分:0)

通常,当你有订单中的项目时,你会有这样的东西(如果你没有,那么如果你能解释你的数据库结构会非常有帮助):

<强>项

  • ID
  • 名称

订单

  • ID
  • CUSTOMER_ID

<强> ORDER_ITEMS

  • id(可选)
  • ORDER_ID
  • ITEM_ID

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

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

如果您在步骤1中有一些笔,而在步骤2中有一些笔,则可以将其拆分为两个ord​​er_items。

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

答案 1 :(得分:0)

重新执行

  

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

您当前的设计以某种方式代表某些情况。但是将一个步骤作为列的表没有问题:

// 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,...)

没有&#34;重载&#34; DBMS有很多列或多行。这就是他们的设计目标。如果有的话,对于大量的表而不是列或行,大多数都有更多的空间和时间限制。

PS重新发现&amp;判断设计

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

  • 如果多个谓词/表只有一个共同的值,那么你可以添加一个参数/列并使用一个谓词/表
  • 如果复杂的谓词/表格可以用更简单的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)

您还可以通过视图定义State。它的定义查询表达式适用于一个表,其谓词正是上面定义的含义。

权衡:您可以为未处理的进程内项目提供单独的表,其中查询条件更加困难。或者,您可以为未处理和正在处理的项目创建一个表,但定义更复杂。