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

Може ли външният ключ да бъде нула?

Колоната (или колоните) на първичен ключ трябва да НЕ е NULL. Записът не може да бъде идентифициран еднозначно чрез NULL. Така че ID колоните в референтния край на външния ключ трябва да бъдат дефинирани като NOT NULL.

Въпреки това е легитимно дизайнерско решение връзката с външен ключ да бъде незадължителна и начинът да се представи това е като направите референтния край на ключа незадължителен, т.е. позволявайки NULL.

От гледна точка на моделиране на данни това, което описахте, е (изключителна) дъга:"таблица ... с два или повече външни ключа, където един и само един от тях може да бъде ненулев." При логическото моделиране дъгите са напълно приемливи, но има силно мнение в полза на прилагането им като отделни таблици. Във вашия сценарий това би било обща Sale таблица плюс две таблици от подтип, VehicleSale и PieceSale .

Предимствата на прилагането на отделна таблица са:

  • по-лесно налагане на ограниченията на външния ключ;
  • по-лесно добавяне на допълнителни колони, свързани с (да речем) продажбите на превозни средства, които не се отнасят за продажбите на парче;
  • по-лесно разширяване на модела с допълнителни подтипове;
  • по-ясен модел на данни, който може да опрости разработването на приложения.

Предимствата обаче не са еднопосочни. Въпреки че е доста лесно да се гарантира, че Sale важи или за VehicleSale или PieceSale но не и двете, налагайки правило, което Sale трябва да имате запис на дете всъщност става доста неудобно.

И така, преобладаващият съвет е, че изключителната дъга е погрешна и като цяло е добър съвет. Но не е толкова ясно, колкото някои го правят.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразуване на малки необработени стойности на Oracle в други типове

  2. Не може да се вмъкне Unicode с помощта на cx-Oracle

  3. Разлики в Oracle между NVL и Coalesce

  4. Кодът при изпълнение отваря jdbc връзката, но не отпечатва данните от таблицата. Какво не е наред с този код?

  5. Как да се справяме с високосните секунди в Oracle