2009-07-28 66 views
0

我有我自己的理論來做到這一點,但我認爲它是一個共同的主題,我會對人們使用的不同方法感興趣。這裏去加入/鏈接/多對多的指導

什麼是處理多對多連接表的最好方法,特別是就它們命名而言,當你需要爲關係添加額外的信息時該怎麼做,以及該做些什麼兩個表之間有多個關係?

假設您有兩張表,用戶和事件,並且需要存儲與會者。所以你創建EventAttendees表。然後要求存儲組織者。如果您

  1. 創建EventOrganisers表,所以每個新關係建模與連接表 或
  2. 重命名EventAttendees到UserEventRelationship(或其他名稱,如User2Event或UserEventMap或UserToEvent)和IsAttending列和IsOrganiser列,即你有你存儲兩個與會者 或
  3. 之間的所有關係信息兩者兼而有之的一個表(真的嗎?) 或
  4. 別的東西完全?

想法?

回答

0

像這樣的通用問題的簡單答案是,「一切都取決於細節」。

但是,一般來說,我可以嘗試創建更少的表格,這可以在不濫用數據定義的情況下完成。所以在你的例子中,我可能會添加一個isOrganizer列到表中,或者可能是一個參與者類型,以允許從觀衆/組織者到觀衆/組織者/演講者/宴會者或任何可能需要的將來的擴展。創建一個具有基本相同列的額外表格,其中表名實際上是一個標識「參與者類型」的標誌,在我看來,從原始設計的角度和從實際的角度來看,都是錯誤的方式。

單個表格更靈活。有了一張表和一個類型字段,如果我們想知道組織者 - 就像我們發送邀請時的計劃意義一樣 - 好的,我們寫「從userevent中選擇userid,其中eventid =?和attendeetype ='O' 」。如果我們想知道每個人都會在那裏 - 比如當我們在午餐桌上打印名片時 - 我們只是不包括參加者類型測試。

但假設我們有兩張表。那麼如果我們只想組織者,好吧,那很簡單,加入組織者桌。但是如果我們想要組織者和觀衆,那麼我們必須做一個聯合,這使得查詢更加複雜,並且通常很慢。如果你在想,做一個工會有什麼大不了的?注意查詢可能還有更多。也許一個人可以有多個電話號碼,我們關心這一點,所以查詢不僅僅是加入用戶和eventAttendee,而且還有電話。也許我們想知道他們是否參加了以前的會議,因爲我們給「校友」特殊優惠,所以我們必須再次參加活動,等等等等。與工會的十人桌加入會變得非常混亂和混亂讀書。