Mysql
 sql >> база данни >  >> RDS >> Mysql

Моделиране на база данни за слаб обект

Един обект не е слаб, защото не може да съществува независимо, а защото не може да бъде идентифициран независимо. Следователно, връзка, която "води" до слаб субект, се нарича "идентифицираща" връзка. На практика това означава, че първичният ключ на родителя се мигрира в (обикновено правилен ) подмножество от 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, освен ако не посочите правилно ключовете си и няма да можете да направите това, без да вземете предвид кой обект може да бъде идентифициран независимо и кой не.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. UPDATE с ORDER BY и LIMIT не работи в MYSQL

  2. Създайте тригер, за да изтриете редове, които са на повече от 90 дни

  3. Засяване на SQLite RANDOM()

  4. Завършващото празно пространство в varchar трябва да се разглежда в сравнение

  5. MySQL броят колони за конкретна стойност