附加到另一個可以更改的對象的對象的數據庫規範化
我正在為連接到機器的設備建構一個庫存管理應用程序。該應用程序允許安排和報告設備的維護和服務。這些機器具有品牌/型號資訊以及站點位置查找。還有附加到設備的日常任務資訊,這些資訊被標記為已完成,用於生成報告。我的應用實體如下所示:
Location Sub-location (fk to location) Make Model (fk to make) Machine (fk to model, fk to sub location) Equipment (fk to machine) Task (fk to equipment, read below for more info on fk's)
我需要根據任務資訊生成報告和日曆,並希望按品牌/型號查看任務以及在單獨的報告中的站點位置。
問題是當設備在位置 A 時可能完成任務,然後設備移動到位置 B - 設備也可能從目前機器中移除並連接到新機器。我需要讓我的應用支持這一現實,並為使用者提供良好的歷史報告和未來調度。
我目前的解決方案如下:
在任務模型上,我對站點位置和機器都有一個 fk,它是在創建任務時從設備和機器複製的。當設備位置或機器發生變化時,我更新所有不完整的ie。已完成的任務會凍結其數據。
我看到的好處是我可以保持我的查詢簡單,而不必總是將任務連接到設備,然後機器來獲取位置和機器/型號/製造資訊,我還可以支持設備移動而無需引入一些歷史類型表以及基於今天日期等的複雜連接。
任何人都可以就這種方法或新方法的優缺點提出建議嗎?
我還要補充一點,這是一個 MySQL/PHP 應用程序,我在其中使用 laravel 和 eloquent ORM。
由於 Make 和 Model 是一種層次關係,它們可以存在於同一個表中。
您需要一個連接表來處理機器、設備和子位置之間的多對多關係。
您的聯結表需要包含四列;
$$ SLID $$,$$ MID $$,$$ EID $$,$$ datetimestamp $$. 您可以通過多種方式處理任務 - 如果一個任務總是跟隨一件設備,那麼任務和設備之間的連結很好,但是,如果同一個任務可以在多台機器上使用多件設備,那麼您需要包含一個任務 ID
$$ TID $$連接表中的欄位。 聯結表將變得非常大,因此您可能希望按月和年對其進行分區,並嘗試使用索引以確保它們滿足報告要求。
此外,由於您使用的是 ORM,我將假設使用 GUID 作為 ID 的想法已經出現,或者在某個時候會出現 - 不要在 guid 列上創建聚集索引(主鍵) ,如果您必須使用 guid 以使應用程序更容易執行其操作,請創建一個整數 id 列作為主鍵。
範例 ERD - 這是我可能從給定要求開始的內容,並根據需要從那裡進行修改。