2010-02-20 37 views
0

我在考慮如何在Rails中創建基於角色的訪問控制系統。我看到這些偉大的項目太多(其中包括):在Rails中消除HasMany關係中的連接表

我的問題是,是否真的需要有一個連接表爲了一切?如果我關係中的一個表只有少數值(比如小於100),我不能只將合併表與該小表合併嗎?)這就是我的意思......這就是我需要的:

模型

  • 用戶
  • 角色
  • 權限
  • 的UserRole/RolesUsers
  • GroupRoles
  • 成員(GroupUsers)
  • RolePermissions

類似的東西...

的方式RoleRequirement作品是通過創建一個roles表和roles_users連接表。這意味着,如果我在一個應用20個總的可能角色,我有20行

  • RolesUsers表具有n行

    • 角色表。

    這意味着每次我想通過角色找到一個用戶,我必須做一個連接。我想知道,不過,因爲只會出現在應用程序中幾個角色,爲什麼不直接替換此遷移:

    create_table "roles", :force => true do |t| 
        t.string "name" 
    end 
    
    create_table "roles_users", :id => false, :force => true do |t| 
        t.integer "role_id" 
        t.integer "user_id" 
    end 
    

    與此一...

    create_table "roles", :force => true do |t| 
        t.string "name" 
        t.integer "user_id" # or some polymorphic form 
    end 
    

    會導致重複(噸的角色名爲「管理」爲例),但由於空間很便宜,我們可以創建一個像Role.unique這樣的方法來查找所有獨特的角色(擺脫那20行表),爲什麼人們創建連接表?

    同樣的事情與權限:我只可能有4個權限開始:create read update delete。所以我不需要權限表和roles_permissions表,我可以複製CRUD權限並在權限表中擁有role_id。與Group相同,如果我的roles表中有多態列,則不需要組角色。

    這樣做的建議方法是什麼?

    這是snippet of the proposed migration

  • 回答

    2

    我不會建議你這樣做。你所描述的是denormalization

    反規範化會給很多應用程序帶來問題,只有在您需要明確需要時纔會出現問題。爲了報告目的,我通常只是將表格歸一化。

    你的問題並沒有表明你有任何需要非規範化。相反,它顯示出對「多餘」表的誤導,並避免了簡單的連接。重複數據的成本不僅僅是空間,還會降低性能(獨特不是免費贈品)。現代RDBMS非常善於處理連接。

    我會建議谷歌搜索和搜索SO的反規範化信息。沒有金科玉律,但你的情況似乎沒有什麼好的理由。

    如果您正在尋找性能提升,請將垃圾郵件中的ActiveRecord引發。有很多選擇,你可以自己寫。

    +0

    非常感謝。剛開始的時候,我讀到了非規範化的問題,以及有多少人認爲RDBMS比CouchDB更令人討厭。沒有豐富的數據庫管理經驗,我不知道在如何劃分數據以及何時加入成爲問題(性能和維護方面)方面有哪些最佳實踐。你有沒有可靠的資源來緩解我對「有額外表格的厭惡」:)。這將有助於! – 2010-02-20 05:03:08

    +1

    http://www.codinghorror.com/blog/2008/07/maybe-normalizing-isnt-normal.html – hobodave 2010-02-20 06:19:54