C, PHP, VB, .NET

Дневникът на Филип Петров


* Релационна база от данни в MySQL

Публикувано на 25 януари 2009 в раздел Бази от Данни.

Релационните бази от данни се появяват като понятие през 1970 от Едгар Код. Най-общо казано релационните бази от данни групират информацията по характерни признаци и я разделя под формата на „релации“ – препокриващо съпоставяне между елементи от две или повече множества. За целта в MySQL релациите се визуализират чрез доста близки до човешкото разбиране структури – таблици. Всяка таблица се състои от редове и колони. Всяка колона има наименование, тип на тези данни и множество от ограничения за тях.

Когато правихме ER диаграми отбелязахме, че „Уникалната характеристика за всяка същност, която еднозначно го идентифицира спрямо другите същности в даден клас, се нарича „ключ“. В MySQL бази от данни това означава, че всяка колона, чийто стойности по редове са задължително различни, може да бъде „ключова“. Например ако имаме таблица с име, факултетен номер и ЕГН на студент може да се каже, че ключови са колоните „факултетен номер“ и „ЕГН“, тъй като те са уникални за всеки отделен студент. Името не може да се приеме за ключов атрибут, тъй като е възможно да съществуват двама студенти с напълно еднакви имена. В релационните бази от данни се избира един от ключовете за дадена таблица и той се прави първичен ключ (primary key). Той е основен инструмент за осъществяване на връзки между таблиците. Първичен ключ може да е съставен както от един, така и от множество атрибути на дадена таблица.

Данните в таблиците се записват с определен тип. Често не е възможно да се запише дадена информация (например в момента не знаем презимето на даден служител). За целта се използва специална стойност на полето – NULL. Едно от основните ограничения в релационните бази от данни е, че първичните ключове не могат да приемат стойност NULL. Друго основно тяхно ограничение е, че не може да има повтарящи се стойности в първичен ключ (стойностите на първичния ключ са уникални за всеки запис).

Външен ключ наричаме атрибут на дадена таблица, който съответства на първичен ключ в друга (с други думи външния ключ на таблица A трябва е сравним с първичния ключ на таблица B). Можете да приемете като вид аналогия външния ключ от една таблица за указател към първичен ключ от друга. Има възможност външните ключове да приемат и стойност NULL, но това може да бъде и забранено по усмотрение на създателя на таблицата. Ограничението за външен ключ е, че той може да приема или стойност NULL (ако му е позволено при дефинирането на таблицата), или стойност равна на стойността в съответстващия му първичен ключ от таблицата, към която „сочи“.

Сега вече можем лесно да направим връзка ER модела на база от данни и релационния ѝ модел в MySQL:

– Класовете от ER модела се превръщат в таблици.
– Атрибутите от ER модела се прехвърлят като колони на таблицата.
– Характеризиращите класове също се представят като обикновени таблици, като имат външен ключ сочещ към първичния на таблицата, която характеризират.
– Подклас се представя аналогично на характеризиращите. Обикновено таблицата на подкласа се свързва с основната таблица чрез външен ключ осъществяващ връзка 1:1, но е възможно и да бъде осъществена като 1:М ако данните го изискват.
– Връзка от тип 1:1 от таблица B към таблица A се осъществява, чрез външен ключ със стойности без повторения в B, който съответства на първичен ключ в A.
– Връзка от тип M:1 от таблица B към таблица A се осъществява, чрез външен ключ в B, който съответства на първичен ключ в A, и в който има възможност за повторения на стойностите.
– Връзки от тип M:M между две таблици се представя като отделна таблица, в която има два външни ключа, сочещи към свързваните таблици.

Всъщност осъществяването на връзки между външен и първичен ключ не е задължително. Можем въобще да не използваме външни ключове, а да ги разгледаме като обикновени колони на таблица. Така обаче ще се лишим от няколко удобства, като интегритет на данните, използване на индекси, и т.н.

 



10 коментара


  1. Desislava Baeva каза:

    Браво, търсих информация за релационните бази от данни, която хем да е теоретична (а не постъпкова инструкция за работа), хем разбираема. Тази е единствената, която намерих.При това доста се порових!!! Благодаря!!!

  2. Благодаря, старая се :)

  3. Валентина Петкова каза:

    За външния ключ на таблица в релационна база данни важи правилото:
    А) Не може да се запише в таблицата, ако не съществува ред от друга таблица със същата стойност на първичен ключ.
    Б) Може да приема произволни стойности.
    В) Трябва задължително да присъства във всяка таблица на релационната база данни, като атрибутите не трябва да се повтарят.
    Г) Идентифицира еднозначно всеки ред
    как мислите?

  4. Мисля, че е добра насока за дефиниция, но А) и Б) си противоречат, а В) и Г) не са верни. По скоро бих обединил двете точки в една:

    A и Б) Външен ключ може да приема само стойност на съответен отговарящ на него първичен ключ или ако му е позволено да не приема никаква стойност (т.е. NULL).

    Точка В не е вярна. Стойностите в колоната на външния ключ могат спокойно да се повтарят (да не са UNIQUE). Именно така се прави релация 1:M !!!

    Точка Г също НЕ е вярна. Външния ключ НЕ идентифицира реда. Той идентифицира релацията на реда към друга таблица.

  5. От известно време чета този блог и наистина е пълно с добре обяснена и полезна информация.

    Бих искал само да попитам за един проблем, на който се натъкнах на скоро и не мога да му намеря решение. Могат ли два външни ключа, от две различни таблици да сочат към първичен ключ на трета таблица.

    Ето и примерно изображение http://i49.tinypic.com/a5ghdy.jpg

    Това са само примерни таблици. Има ли някакво решение за това?

  6. Стоимен: Това не е проблем. Съвсем нормално е и се използва често.

  7. Аз ползвам mysql и създавам таблиците си с InnoDB, обаче като се опитам да ги навържа с външни ключове по посочения начин дава грешка.

    Ако ползвам myisam всичко е наред, но доколкото знам myisam не е добре да се ползва за релационни бази данни…

  8. Ако покажеш какво правиш ще отговоря къде е проблема. MyISAM въобще няма FOREIGN KEY…

  9. Разбира се, че е така. Сега ще го поправя.

  10. Guest каза:

    „- Връзка от тип 1:1 от таблица B към таблица A се осъществява, чрез външен ключ със стойности без повторения в B, който съответства на първичен ключ в A.
    – Връзка от тип 1:1 от таблица B към таблица A се осъществява, чрез външен ключ в B, който съответства на първичен ключ в A, и в който има възможност за повторения на стойностите.“

    Едното от двете трябва да е 1 : М ? предполагам 2рото

Добави коментар

Адресът на електронната поща няма да се публикува


*