簡體   English   中英

Rails-現有模型的最佳數據庫設計

[英]Rails - best database design for existing model

因此,我繼承了一些需要添加的Rails 4代碼和數據庫模型。

名為mpb_item的模型有一個名為mpb_items的表。

在該項目表內有諸如以下的列:

role1_start_date, role2_start_date, role3_start_date, role4_start_date

不理想,但這就是事實。 我猜他們應該在單獨的角色表中。

我需要添加功能來掛起這些角色中的任何一個(或全部)。

我想我可以:

  1. 在現有表中,我可以為每個現有角色列添加一個新的布爾列。 例如: role1_suspendedrole2_suspended

  2. 創建一個名為mpb_suspensions表,該表包含2列: mpb_item_idrole_name 由於角色本身沒有id,因此role_name列將存儲“ role1”或“ role2”等,具體取決於掛起的角色。

在我的View ,我需要有“暫停”的能力,每個作業,或全部。 我不確定模型代碼將如何執行此操作,哪種方法最好。

如果必須構建它,請在您提供的最少信息的基礎上,選擇您描述的選項2。 (RoleSuspension是它自己的表)好處包括:

  • 新列總數減少,並且不會使任何表無限大
  • 無冗余列(角色1,角色2等)
  • 如果可能的角色數發生變化(即,將其標准化,則無需添加更多列)
  • 無零值(方法1)
  • 您可以輕松地查詢RoleSuspensions的總體狀態(而使用方法1時,您需要對role1_suspended,role2_suspended等中的非nil值進行計數,然后對其求和),並且更易於索引
  • 您可以將邏輯附加到RoleSuspension; 它是與其父MbpItem不同的動物。 如果只是一堆布爾型列,則任何復雜的邏輯都需要融合到MbpItem模型中,並且維護起來可能會更麻煩。

按照選項2的邏輯,掛起角色將涉及創建這樣的新記錄:

@mbp_item.role_suspensions.create!(role_number: 2)

而檢查暫停狀態將涉及以下內容:

if @mbp_item.role_suspensions.any?
# or....
RoleSuspension.where(role_number: 3).each do |s|
  puts "Item #{s.mbp_item} is suspended for role #{s.role_number}."
end

根據以下問題的答案,使用這種方法將更加考慮數據庫性能:

  • 您需要在哪里以及多久檢查一次角色暫停?
  • 當您檢查角色暫停時,您如何處理這個問題? 換句話說,某個全局任務詢問“存在哪些角色掛起,以及哪些mbp_items?” 還是在渲染該對象時檢查給定mbp_item狀態?

如果您需要非常頻繁地檢查角色掛起,也許應該在mbp_items添加一個名為has_suspensions的布爾列,這將是部分緩存,因為它將指示此MbpItem是否存在任何掛起(必須在after_create維護)和after_destroy掛鈎)。

另一方面,如果您知道掛起信息永遠不需要其自己的邏輯,也永遠不需要直接查詢,則可以在MbpItem中添加單個role_suspensions ,其中包含一個用於掛起角色的整數序列化數組。 就數據庫結構而言,這將是一種侵入性較小的方法,甚至可能比選項1更簡單,因為它允許您以更少的代碼和更少的元編程來掛起和取消掛起任何角色編號,但是如果您需要的話在暫停或取消暫停過程中添加任何奇特的邏輯(即,如果RoleSuspension應該將狀態作為其自己的對象),您會后悔這種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM