[英]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
然后,您將必須聲明實際的多對多關系 。
它的工作原理幾乎相同,但是除了這是的以外 , 您將沒有任何其他有關此男人和這個女人之間存在的信息 。 我們不知道什么,我們不知道什么時候,我們不知道多久。
為此,您將用以下代碼替換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.