2014-01-29 151 views
1

我有一種數據稱爲chain。每個chain由稱爲step的另一種數據的特定序列組成。所以chain最終由多個steps以特定順序組成。我試圖找出MySQL中設置此最好的方式,讓我做到以下幾點:如何爲此多對多關係設置關係數據庫表?

  1. 查找鏈中的所有步驟,並讓他們在正確的順序
  2. 看了包含了一步所有連鎖

我目前正在考慮下表設置爲相應的解決方案:

TABLE chains 
id date_created 

TABLE steps 
id description 

TABLE chains_steps (this would be used for joins) 
chain_id step_id step_position 

在表chains_steps,012將使用列來正確排序鏈中的步驟。 JOIN表包含自己獨特的數據,例如step_position在這種情況下似乎不常見。但也許這並不罕見,我只是缺乏經驗/偏執狂。

我沒有太多的經驗,所以我想獲得一些反饋。我建議的三個表格是否正確地執行此操作?有沒有可行的選擇,如果有,有哪些優點/缺點?

回答

1

你做得對。

考慮一個包含EmployeesProjects表的數據庫,以及如何以多對多的方式鏈接它們。您可能會想出一個Assignments表(或某些命名約定中的Project_Employees)。

在某些時候,您會決定不僅需要存儲每個項目分配,還需要在分配開始時以及分配完成時進行存儲。把它放在作業本身的自然地方;將它與項目或員工一起存儲是沒有意義的。

在進一步的設計中,您甚至可能會發現需要存儲關於作業的更多信息,例如在員工評審過程中,您可能希望存儲與其在該項目中的表現相關的反饋,因此您可以將作業與Review表的關係的「一」結束,其將與Assignments聯繫,其中assignment_id與FK關聯。

因此,簡而言之,擁有具有自己數據的聯結表是非常正常的。

+0

感謝您在交匯表中額外數據的開發示例! – maxedison

1

看起來很好,連接表包含位置/等級字段並不罕見。

查找鏈中的所有步驟,並讓他們在正確的順序

SELECT * FROM chains_steps 
    LEFT JOIN steps ON steps.id = chains_steps.step_id 
    WHERE chains_steps.chain_id = ? 
    ORDER BY chains_steps.step_position ASC 

查找包含了一步所有連鎖

SELECT DISTINCT chain_id FROM chains_steps 
    LEFT JOIN chains ON chains.id = chains_steps.chain_id 
1

我認爲這個計劃,你已經概述是正確的做法。不要太擔心映射表上step_position的存在。 step_position之後的所有數據都與chain的上下文中的step直接相關。所以chains_steps表是適合它的恕我直言。

有些事情要考慮:

  1. 外鍵 - 使用它們!
  2. chains_steps表格上的唯一鍵 - 是否可以在單個鏈中的多個位置存在一個步驟?在不同的連鎖店呢?

祝你好運!