2013-03-27 44 views
1

用戶有許多任務。 (tasks.user_id = USER_ID)數據庫模式 - 多態關聯與單獨表格

任務有許多標籤(通過Acts as taggable on

用戶實現有許多列表 - >其中有許多任務(A名單只是多個標籤的包裝,例如{列表ID = > 1,name =>「shopping vacation summer」}將檢索標記爲所有這些標籤的所有任務)

例如,如果用戶轉到url tags/shopping%20vacation,我的代碼會執行查找用於:

Task.all.tagged_with(["shopping", "vacation"]) 

沒有查找t能夠或外鍵爲task.list_id

我希望用戶能夠與其他用戶共享任務,列表和標籤。

共享任務的用戶與其他用戶共享該任務。

共享列表的用戶將該列表中的所有任務打開到另一個用戶。

共享標籤的用戶將標記有該標籤的所有用戶任務打開給其他用戶。

對我來說,有幾個選擇,我想就我可能沒有想過的每個選項的優缺點提供一些意見。

一個是針對每個共享項目的獨特表:

shared_tasks:TASK_ID,shared_to_id(或USER_ID) shared_lists:LIST_ID,shared_to_id shared_tags:TAG_ID,shared_to_id

OR:與

一個多態關聯

shareables:shared_id(item_to_share),shared_to_id,shared_type

各有什麼優缺點?

有沒有另外的解決方案,我沒有想到?

回答

2

我個人會改變模式設計。以任務爲例,我現在將其視爲與用戶的多對多關係,而不是像目前一​​樣多對多。因此,這意味着刪除列任務.UserId並添加一個名爲UserTasks的新表,該表將Task與用戶定義爲(UserId,TaskId,IsOwner)相鏈接。對於任務所屬的用戶,IsOwner設置爲1,如果共享但屬於其他人,IsOwner設置爲0。這將使查詢變得更容易,例如,您可以執行單個選擇來獲取擁有和共享的任務,而不是2個單獨的查詢,也可以避免union。

+0

這實際上是一個好主意 - 最初我在每個Task.owner_id上都有一個專欄,但這是一個很好的選擇。正如你所說,它也大大簡化了事情,因爲所有任務都將通過連接表來檢索。謝謝回覆。 – Squadrons 2013-03-28 19:55:37