簡體   English   中英

簡單的多對多關系

[英]Simple many-to-many relationships

抱歉,我沒有睡覺,所以只想澄清一下我的想法。

一個團隊可以有多個用戶,但是一個用戶可以是多個團隊的成員。

這是多對多關系嗎? 如果是這樣,我是否需要第三個表將它們加入MySQL?

是。 而且,您幾乎可以肯定需要第三張“關系”表。

最簡單的選擇是擁有一個關系表,該關系表指示團隊中的用戶。

團隊== Rel ===用戶

要查詢團隊中的用戶,請在rel中搜索一個teamId的所有usersId,反之亦然,以檢查該用戶所屬的團隊。

多對多關系

存在多對多的關系 ,您應該指出它的作用方式與多對一/一對多的方式有所不同。 因此,這根本不是一個愚蠢的問題。

大多數時候,您將需要添加一些額外的字段,這些字段是此關系的特征。 因為您將需要獲取有關您自己的人際關系的信息

是否需要額外的信息(從而需要額外的字段)將確定是否需要第三方表。

現實生活中的例子:男人和女人

假設您有男女表。 一個男人可以和許多女人約會,一生一世。 因此,您具有典型的多對多關系。 您可以在沒有第三張桌子的情況下進行操作。

但是現在,假設您想添加一條信息:對於每種關系(無論是浪漫的關系還是數據庫的關系(從沒想過我會在生命中的某一天都說過這句話)),您都想知道工會何時開始,以及結束時間。

然后,您需要一個第三方表。

結構體

讓我們看看現實生活中的示例結構是什么樣子。

我用簡化的Doctrine2風格的Yaml編寫了此代碼 ,該模型默認運行Symfony2

tableName: Man
    fields:
        id:
            type: int
            id: true
        firstName:
            type: string
        dateOfBirth:
            type: datetime
        favSport:
            type: string
        womenHePrefers:
            type: string
    oneToMany:
        relationships:
            target: ManMeetsWoman
            mappedBy: man
            cascade: remove

tableName: Woman
    fields:
        id:
            type: int
            id: true
        firstName:
            type: string
        dateOfBirth:
            type: datetime
        favAuthor:
            type: string
        menShePrefers:
            type: string
    oneToMany:
        relationships:
            target: ManMeetsWoman
            mappedBy: woman
            cascade: remove

tableName: ManMeetsWoman
    fields:
        id:
            type: int
            id: true
        dateOfEncounter:
            type: datetime
        dateOfBreakUp:
            type: datetime
    manyToOne:
        man:
            target: Man
            inversedBy: relationships
        woman:
            target: Woman
            inversedBy: relationships

關鍵點

  • 您的男人和女人表都與您的ManMeetsWoman表具有oneToMany關系
  • 您的ManMeetsWoman表將與其他兩個表具有多對一關系
  • 理想情況下,您將放置級聯規則,以確保當從Man表中刪除Man時,引用該Man的關系也將從第三張表中消失。

如果您不想要另一個桌子怎么辦

然后,您將必須聲明實際的多對多關系

它的工作原理幾乎相同,但是除了這是的以外您將沒有任何其他有關此男人和這個女人之間存在的信息 我們不知道什么,我們不知道什么時候,我們不知道多久。

為此,您將用以下代碼替換oneToMany和manyToOne:

# Man:
    ManyToMany:
        woman:
            target: Woman

# Woman:
    ManyToMany:
        man:
            target: Man

但是,如果沒有良好的ORM的支持,它的管理將變得棘手。 因此,第三部分表通常仍然是最好和最簡單的解決方案。 另外,它允許您添加有關關系本身的信息。

是的,確實是,這是多對多關系的一個例子。

這里的users是一個實體; Team是另一個實體。 兩個實體都參與Membership關系。

因此,在將其轉換為關系表時; 您將必須創建3個表。

一個前級users ,另一個用於team ,另一個用於membership (您可以為關系指定任何有意義的名稱)關系,這將具有表用戶和團隊的外鍵,如userid和teamid。

暫無
暫無

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

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