2012-07-20 57 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會指向您當前所在組的位置。