2012-07-20 25 views
1

的位置。如果我有一组名为表:库存系统 - 正确的方法来跟踪的状态和部分

[Part_one_id|Part_two_id|Part_three_id|status|location] 
    1   7   6  ready  long/lat 
    2   2   9  in-use long/lat 

而且有每个零件三个独立的部分表:

 Part one      Part two     Part three 
[id][measurement]    [id][pressure]    [id][temperature] 

我应该跟踪位置和状态?

  1. 任何时候该组的状态更新,运行另一个查询来更新自己的表中各部分的状态和位置
  2. 如果我需要找出一个位置是我看哪个组是进入并拉起当前位置
+0

你可以用触发器来做到这一点,或者如果你正在使用带有活动记录的MVC框架,可以对任意表执行AfterSave更新。 – Panagiotis 2012-07-20 20:23:44

+0

我会使用选项2.它不需要触发器,它将组中项目的位置集中在一个表中,而不是在三个部分表中添加重复信息。 – 2012-07-20 20:26:34

+0

@Eric但如果我想简单地列出部分和他们的位置与选择。我需要在PHP中从数据库中获取当前位置后重复列表。 – user781439 2012-07-20 20:45:13

回答

1

我的桌子结构看不到蝙蝠,有几个大问题。

  1. 你永远不应该有类似的表:part1_id,part2_id,......因为如果你想要更多的部件添加到行比你需要添加列原来的设计,用一个大表,这是untractable。而是使用与连接表的多对多关系。
  2. 您应该审核位置,以便在任何给定的时间点拍摄快照。这意味着你应该有一个审核表,它具有part_id,location_id,创建,修改和位置表具有纬度/经度。

至于问题本身的答案。我并不特别喜欢MySQL触发器,因为它的语法不是很好,而且它们的功能也不如它们在PostgreSQL或Oracle等其他数据库中的效果。话虽如此,触发器在这个实例中的吸引人的事情是,触发器将在与触发它的更新/插入相同的事务中执行,所以您将免费获得该业务规则。但是,根据您用于访问数据库的内容,您可以启动一个事务,直到完成审计插入后才结束。

最终你的表格会改变的样子是:

组:ID,名称,创建,修改,状态

part_group:PART_ID,GROUP_ID,创建,修改

位置: ID,纬度,经度

group_location:GROUP_ID,LOCATION_ID,创建,修改

然后最近创建的group_location会指向您当前所在组的位置。