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

Проектиране на релации 1:1 и 1:m в SQL Server

Всяка връзка изисква "родителската" таблица (от едната страна) да има първичен (или уникален) ключ (PK), който уникално идентифицира всеки ред, а "дъщерната" таблица (от другата страна) да има колона или колони с външен ключ , които трябва да бъдат попълнени със стойности, които са същите като някои съществуващи стойности на първичния ключ в родителската таблица. Ако искате връзка едно към много (1-M), външният ключ трябва да бъде обикновен атрибут (колона или колони) в дъщерната таблица, който може да се повтаря (може да има много редове с една и съща стойност)

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

Връзката 1-1 ефективно разделя атрибутите (колоните) в таблица на две таблици. Това се нарича вертикална сегментация. Това често се прави за подкласиране обектите на таблицата или по друга причина, ако моделите на използване на колоните в таблицата показват, че някои от колоните трябва да бъдат достъпвани значително по-често от останалите колони. (Да кажем, че една или две колони ще бъдат достъпвани 1000 пъти в секунда, а останалите 40 колони ще бъдат достъпвани само веднъж месечно). Разделянето на таблицата по този начин на практика ще оптимизира модела за съхранение за тези две различни заявки.

Подкласиране . Горното всъщност създава връзка 1 към нула или едно, която се използва за това, което се нарича връзка подклас или подтип. Това се случва, когато имате два различни обекта, които споделят голям брой атрибути, но единият от обектите има допълнителни атрибути, от които другият не се нуждае. Добър пример може да са Служителите и SalariedEmployees . Служителят таблицата ще има всички атрибути, които споделят всички служители, и SalariedEmployee таблицата ще съществува във връзка (1-0/1) със Служители, с допълнителните атрибути (Заплата , Годишен отпуск и т.н.), от които се нуждаят само служителите на заплата.

Ако наистина искате връзка 1-1, тогава трябва да добавите друг механизъм, за да гарантирате, че дъщерната таблица винаги ще има един запис за всеки запис/ред в родителската таблица. Като цяло единственият начин да направите това е като наложите това в кода, използван за вмъкване на данни (или в тригер, съхранена процедура или код извън базата данни). Това е така, защото ако сте добавили ограничения за референтна цялост на две таблици, които изискват редовете винаги да са и в двете, няма да е възможно да добавите ред към нито една от тях, без да нарушите едно от ограниченията, и не можете да добавите ред към двете маси едновременно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да върнете низ в обратен ред с помощта на SQL Server – REVERSE()

  2. Класически проблем с ASP при свързване към отдалечена база данни на SQL Server

  3. Как да почистя (предотвратя SQL инжектирането) динамичен SQL в SQL Server?

  4. Къде се записва задействане на сървър в SQL Server?

  5. Управление на връзката на SQL Server с C#