Един обект не е слаб, защото не може да съществува независимо, а защото не може да бъде идентифициран независимо. Следователно, връзка, която "води" до слаб субект, се нарича "идентифицираща" връзка. На практика това означава, че първичният ключ на родителя се мигрира в (обикновено правилен ) подмножество от PK на детето (терминът „слаб обект“ обикновено се дефинира във връзка с първични ключове, въпреки че на теория може да се прилага за всеки ключ).
Напълно законно е да има субект, който не може да съществува независимо, но може да бъде идентифициран независимо – с други думи, който е в неидентифицираща връзка с не-NULL.
Трябва да попитате:can historyLineID
бъди уникаленсама , или в комбинация с orderID
? Подозирам, че последният е такъв, което би го направило слаб обект.
Това, което ни показахте, не е слаб обект – PK на родителя не се мигрира в PK на детето.
По същество имате две възможности:
-
orderHistory
има съставен PK:{orderID, historyLineID}
, къдетоorderID
е FK. BTW, този PK може да се счита за „естествен“: -
orderHistory
има сурогатен PK:{orderHistoryID}
, докатоorderID
е извън ПК. Все пак ще трябва да имате алтернативен ключ{orderID, historyLineID}
все пак:
Да, това е първият вариант, описан по-горе. Освен ако нямате дъщерни връзки в orderHistory
само по себе си, това също е най-доброто решение. Ако orderHistory
има деца, то това може или не е най-доброто решение, в зависимост от няколко фактора.
Това не е или-или. Едно поле може да бъде както FK, така и част от (основен или алтернативен) ключ, както е показано по-горе.
Няма да можете да стигнете до 3NF, освен ако не посочите правилно ключовете си и няма да можете да направите това, без да вземете предвид кой обект може да бъде идентифициран независимо и кой не.