0

不確定這是什麼最好的實現。我有兩種不同類型的財產,我想追蹤故障。我希望能夠在特定屬性的顯示頁面上顯示故障,然後查看故障索引頁面上的所有故障。關係數據庫實現

對於每個屬性有多個故障表或每個屬性鏈接到哪個故障表會更好嗎?如果全部放在一起,我擔心故障表中有多個空白id屬性。但是如果他們分開了,我擔心在視圖中顯示它們。我用rails來實現這個。

一個故障表

Cars     Trucks    Faults 
-----------   ----------   ----------- 
car_id     truck_id    fault_id 
attribute_1   attribute_1   car_id 
              truck_id 
              fault description 

兩個故障表中(每個屬性之一)

Cars     Trucks    car_Faults    truck_faults 
-----------   ----------   -----------    ----------------- 
car_id     truck_id    car_fault_id   truck_fault_id 
attribute_1   attribute_1   car_id     truck_id 
              fault description  fault description 

回答

2

你可以使用與您現有模型的多態關聯,或者使用單表繼承將汽車和卡車結合到一個類中。


態關聯看起來是這樣的:

Cars     Trucks    Faults 
-----------   ----------   ----------- 
id      id     id 
attribute_1   attribute_1   faultable_id 
              faultable_type 
              fault description 

您必須添加faultable_id(int)和faultible_type(字符串)列Fault。模型將如下所示:

def Car < ActiveRecord::Base 
    has_many :faults, :as => :faultable 
end 

def Truck < ActiveRecord::Base 
    has_many :faults, :as => :faultable 
end 

def Fault < ActiveRecord::Base 
    belongs_to :faultable, :polymorphic => true 
end 

可以讓你做到這一點:

@car.fault 
# => returns car's fault 

@fault.faultible 
# => returns car or truck 

單表繼承(STI)看起來是這樣的:

Vehicle    Faults 
-----------   ---------- 
id      id 
type     vehicle_id 
attribute_1   fault description 

這是有點難理解,但CarTruck都將繼承Vehicle超類的故障。這允許您在使用僅一個數據庫表(單表繼承)的情況下擁有與故障相關聯的汽車和卡車。

汽車和卡車將作爲車輛記錄存儲,並將共享共同屬性。對於具有幾乎相同屬性的模型(例如「顏色」或「製造」),這非常理想。請記住,未使用的屬性(卡車對象中的汽車屬性)將爲零。如果你正在處理許多不可互換的屬性(因此還有許多nils),最好使用多態關聯。

型號:

def Vehicle < ActiveRecord::Base 
    has_many :faults 
end 

def Car < Vehicle 
end 

def Truck < Vehicle 
end 

def Fault < ActiveRecord::Base 
    belongs_to :vehicle 
end 

有了這個,你可以這樣做:

@truck.fault 
# => returns truck's fault 

@fault.vehicle 
# => returns either a Car or Truck object, depending on the type 

有一些注意事項,使用STI:

  • 你必須初始化一個子類(汽車或卡車); 從不實例化超類(即Vehicle.new)。請勿觸摸Vehicletype屬性。 Rails自動處理它。

  • 沒有收集類的方法,所以像Truck.faults(所有卡車的故障)將不起作用。

+0

沒有機會玩它,但它看起來像多態性工作。我假設您可以將關聯添加到超過2個模型,方法是將所有需要關聯的表添加爲as => faultable?以上表格是使用 – 2013-04-25 12:14:59

+0

正確的實際模型Im的簡化表示。只要它們都使用':as =>:faultable'接口,就可以在多態關聯中使用盡可能多的模型。 – Substantial 2013-04-26 01:50:24

+0

我可以讓你檢查這個設計實現,看看它是否有意義/作品?我試圖確保從一開始就正確設置了這一設置,而不是構建糟糕的設計,並遇到訪問數據時出現問題的問題。 – 2013-04-26 22:39:18

0

如果你希望能夠給所有的故障顯示在一起,並且還能夠顯示每個故障財產我會認爲這樣的解決方案可能是你在找什麼

Vehicles    Faults      Types 
-----------   -----------     --------- 
vehicle_id    fault_id     vehicle_type 
vehicle_type(FK)  vehicle_id(FK)     
attribute_1   vehicle_type(FK) 
         fault_description 

然後在TypesTruck

編輯條目,一個用於Car,和一個:在進一步的思考,我意識到,在Faultsvehicle_type是不必要的,因爲獲得Car故障,您可以使用:

SELECT fault_id AS F FROM Faults WHERE F.vehicle_id IN 
    SELECT vehicle_id FROM Vehicles AS V WHERE V.vehicle_type IN 
    SELECT vehicle_type FROM Types WHERE vehicle_type = 'Car'