回答
沒有嚴格的規則來決定關係中表的作用。事實上,這就是關係模型的美麗和創新:沒有層次結構。
通常,如果從某個表到另一個表存在硬依賴關係,則子表或父父角色由表的語義決定。例如:在order
,order_details
關係中,很明顯order
是父項,order_details
是子項。
在其他情況下,還不清楚關係在關係中扮演什麼角色。例如:orders
和customers
的關係。如果您執行查詢以獲得屬於某個customer
的所有orders
,則父代可能是customers
和orders
是兒童。但是,您也可以執行查詢以獲取特定order
的所有貨件信息(存儲在customers
關係中),在這種情況下,您可能會認爲order
是父項,而customers
是此查詢中的子項。
正如我之前所說的,當關系模型在70年代後期發明時,它的主要優點之一就是能夠查看相關數據而不考慮它們的依賴關係。
一個偉大的定義提出here:
一個識別關係是當行的一個子 表的存在依賴於父表中的一行。 (...)正式地,「正確的」 這樣做的方法是使外鍵[即父母的主鍵]部分 孩子的主鍵。
一個子表(AKA weak entity)是一個表,它的主鍵屬性上的另一個表依賴,因而識別的子表或部分地由表中的行識別這取決於(父)。沒有父表中的對應行時,子表中的行不能存在。
爲了說明,我們來看一個我們都很熟悉的簡單且完全相關的例子:父母和子女在家庭背景下。我們可以模擬出與表這種關係像這樣:
在上面的模型中,Parents
表的每一行是由SSN
唯一標識。SSN
是每個父母的內在和唯一屬性,因此它是一個獨立或「強壯」的實體,因爲它不依賴於另一個表來定義其身份。
兒童然而,需要父以存在(在Parents
表Parent_SSN
必須參照現有SSN
)。
請注意Children
表中的複合主鍵(Parent_SSN, Name
)。這意味着孩子們唯一標識由組合Parent_SSN
和Name
。您無法僅根據Name
字段查詢單個孩子,因爲多個父母可能有名稱相同的孩子。同樣,您不能僅基於Parent_SSN
字段查詢單個子項,因爲一個父項可能有許多子項。考慮到這一點,兒童部分由其父母認定,因此確定的關係。
但SSN不能讓兒童唯一識別嗎?當然,爲什麼是。讓我們繼續前進,並調整我們的模型,包括:
在這個版本的車型,注意我們已經介紹了SSN
領域Children
。兒童的獨特身份現在由他們自己固有的和獨特的SSN
定義。他們的身份不再取決於Parents
表中的。雖然Parent_SSN
領域仍引用Parents
表的SSN
,它在孩子的獨特的身份沒有參與,因此父母有非識別關係到他們的孩子,而現在這兩個表可以考慮「強大」的獨立實體。
順便說一句,這個版本的模型具有在第一幾個優點:
- 一位家長現在可以有兩個或兩個以上的孩子使用相同的名稱,而在以前的模型中entity integrity約束將不允許這樣做。
- 您可以允許
Parent_SSN
字段包含NULL
來說明您有關於孩子的數據的事件,但不知道他/她的父母是誰。
在上述兩種模式中,Parents
表被認爲是Children
表的父表。然而,在非識別像第二種模式關係,Parents
只有外鍵Parent_SSN
因爲Parent_SSN
引用的背景下,父表/在Parents
表上SSN
取決於,但不有任何部分在確定兒童的真實身份。
爲了說明爲什麼決定哪些表的父/子表,考慮下面的例子涉及循環依賴時環境是很重要的:
在這個例子中,員工和部門是唯一的標識自己自己的屬性,並不從其他表中導出其身份的任何部分。
在這裏,我們有兩個非識別關係:僱員工程(在Employee
表DeptNo
)一個部門,一個部門由員工(ManagerSSN
在Department
表)進行管理。哪一個是父表? ...孩子桌子?
這取決於上下文 - 您正在談論哪種外鍵關係?由於DeptNo
是引用/依賴在Department
表中的表DeptNo
上表部門DeptNo
上下文中的部門表將被視爲父表。
然而,僱員表將被認爲是在ManagerSSN
在Department
表上下文父表,因爲ManagerSSN
是引用/依賴上Employee
表。
- 1. 識別和非識別關係
- 2. 識別與SQL中的非識別關係
- 3. MySQL> psuedokey表列應該是識別還是非識別關係?
- 4. MySQL的外鍵與非識別關係
- 5. 非已識別的關係,外鍵
- 6. 外鍵識別與非識別關係之間的性能差異
- 7. 識別哪個子視圖被挖掘
- 8. 識別數據庫中的關係
- 9. 識別聯繫表7
- 10. 識別非數字
- 11. 如何識別使用手勢識別器輕敲哪個UIImageView?
- 12. 如何識別Django中的哪個ajax?
- 13. 使用哪種語音識別系統?
- 14. Mixpanel無法識別使用「別名」或「識別」的用戶
- 15. 識別關係的行沒有劃分
- 16. 實施與EF4的識別關係
- 17. 「產品類別」是否與「產品」具有識別關係?
- 18. 語音識別/識別
- 19. 是否自動識別OneToMany關係ManyToMany關係?
- 20. 識別子圖像
- 21. 識別在bb中按哪個鍵
- 22. HasOne識別關係不保存
- 23. 無法讓LinqDataSource識別關係
- 24. 我如何識別關係= NoFOLLOW鏈接
- 25. 用於1對1不識別關係
- 26. PyCharm不識別Buildout依賴關係
- 27. 識別功能依賴關係
- 28. 視覺範式識別關係
- 29. Django識別非字段驗證錯誤與哪個表單關聯
- 30. 如何識別bash腳本中的哪個操作系統
'人''國'關係怎麼樣?我猜這裏的人就是父表。在這種關係中將是一個人名單和國家名單。每個人都需要有一個國家(識別關係),但是在MySQL文檔中它說:「一個識別關係是子表不能在沒有父項的情況下唯一標識的。」這意味着父項表將是「國家」孩子表是「人」,這是我所期望的完全相反...... –
@Jackobud:不一定。這取決於你在找什麼(你的查詢)。在這種情況下,「子表不能在沒有父表的情況下唯一標識」的情況下,「國」和「人」表都不是關係中的孩子。在這種情況下,MySQL的文檔指的是一個完全的依賴關係:即'order_details'不存在沒有它們相應的'orders'的地方。 –
嗯,我的例子是一個識別還是非識別關係? –