logo search
Лекція_1_Проектування БД

4. Первинні ключі

Ключі - це фундамент і цемент реляційної моделі. Первинний ключ унікальним образом ідентифікує кожний запис у таблиці. Наприклад, адреса електронної пошти - це первинний ключ, що унікальним образом ідентифікує кожного покупця; номер замовлення - це первинний ключ, що унікальним образом ідентифікує кожне замовлення. В ідеалі первинний ключ складається тільки з одного поля. Однак іноді для формування первинного ключа потрібно кілька полів. Наприклад, для вказівки місця розташування потрібні одночасно довгота й широта. В ER-діаграмі первинні ключі підкреслені й виділені жирним шрифтом.

Первинні ключі необхідно вибирати обережно. Кожний первинний ключ повинен задовольняти наступним вимогам:

Існує неясність щодо унікальності й розміру первинного ключа. Чим більше полів включено в первинний ключ, тим більше шансів, що ключ буде унікальним. Однак розроблювач повинен знайти таке найменше число полів, які б формували унікальний ключ. На рис. 2.7 зображено кілька варіантів первинних ключів, які унікальні, але не мінімальні. На рис. 2.8 показаний правильний варіант первинного ключа, що і унікальний, і мінімальний.

На практиці пошук первинного ключа, що задовольняє всім перерахованим вище вимогам, може виявитися нелегкою справою. Ми розглянемо чотири розповсюджених сценарії вибору первинного ключа: використання існуючих полів, використання комп'ютера для генерування поля, створення зв'язаної таблиці й створення асоціативної таблиці.

MEMBER

email

fname

Iname

phone

jumps

equip

level

dayj@ohio.edu

John

Day

592-0646

5

Y

В

compton@ohio.edu

Ted

Compton

592-1111

12

N

I

mcgann@ohio.edu

Sean

McGann

592-2222

20

Y

A

MEMBER

email

fname

Iname

phone

jumps

equip

level

dayj@ohio.edu

John

Day

592-0646

5

Y

В

coompton@ohio.edu

Ted

Compton

592-1111

12

N

I

mcgann@ohio.edu

Sean

McGann

592-2222

20

Y

A

MEMBER

email

fname

Iname

phone

jumps

equip

level

dayj@ohio.edu

John

Day

592-0646

5

Y

В

compton@ohio.edu

Ted

Compton

592-1111

12

N

I

mcgann@ohio.edu

Sean

McGann

592-2222

20

Y

A

Рис.2.7. Унікальні, але не мінімальні первині ключи

MEMBER

email

fname

Iname

phone

jumps

equip

level

dayj@ohio.edu

John

Day

592-0646

5

Y

В

compton@ohio.edu

Ted

Compton

592-1111

12

N

1

mcgann@ohio.edu

Sean

McGann

592-2222

20

Y

A

Рис. 2.8 Адреса електронної пошти - це унікальний і мінімальний первинний ключ

Первинні ключі найчастіше формуються з одного або більш існуючих у таблиці полів. Приміром, номер соціального страхування може стати гарним первинним ключем для співробітників, номер машини може бути відмінним первинним ключем для автомобілів. Первинні ключі, що складаються з одного поля, більш кращі через свою простоту. Однак буває, що для формування первинного ключа потрібно більш одного поля, наприклад, широта й довгота спільно формують первинний ключ у топографії. До первинного ключа, сформованого з більш ніж одного поля, однаково звертаються як до окремого елемента. Первинний ключ, сформований з існуючих полів, зображений на мал. 2.9.

Рис. 2.9. Первинний ключ, сформований з існуючих полів

Рис. 2.10 Первинний

ключ, сгенероваий

комп'ютером

У багатьох випадках компанії для швидкого доступу до унікальних записів використовують номера. Номера броні, номера замовлень і номера покупців слугують як однозначні ідентифікатори записів. Такі сгенероваі комп'ютером поля часто формуються шляхом додавання одиниці до останнього призначеного номера. Первинний ключ також може бути сгенерирований комп'ютером для одержання первинного ключа, що складає з одного поля, замість тих, що складаються з декількох полів. Сгенерований комп'ютером первинний ключ показаний на мал. 2.10.

Створення зв'язків: зовнішні ключі

Батьківська таблиця відтворює свій первинний ключ у кожній дочірній таблиці, до якої вона підключена. Оскільки ці відтворені значення були створені поза дочірньою таблицею, вони називаються зовнішніми ключами. Зовнішні ключі зв'язують родинні записи між батьківською й дочірньою таблицею. Зовнішній ключ розміщається в дочірній таблиці (за «вороньєй лапкою»). Зовнішні ключі виділені на діаграмі жирним і позначаються в такий спосіб: ІМ'Я_БАТЬКІВСЬКОЇ_ТАБЛИЦІ$ім'я_батьківського_поля. (Флеминг і Ван Хол, 1988). Приміром, Клієнт$email - це зовнішній ключ, що вказує на поле електронної пошти email у таблиці Клієнт. Важливість зовнішнього ключа не можна недооцінювати. Зовнішні ключі - це лише спосіб подання зв'язків у реляційної базі даних. Система бази даних бачить тільки зовнішні ключі, а не сполучні лінії. Первинний і зовнішній ключі зображені на мал. 2.11.

Рис. 2.11 Зовнішні ключі відповідають за створення зв'язків

Залежна таблиця (також називана слабкою сутністю) - це дочірня таблиця, якій для ідентифікації необхідна батьківська таблиця. Приміром, на футболці гравця написаний як його номер, так і назва команди, наприклад 19 гравець команди Динамо. Номери унікальні тільки усередині команди, оскільки кожна команда використовує ті самі числа. На рис. 2.12 показані таблиці команди (Команда) і гравця (Гравець). Таблиця Команда є батьківською, а таблиця Гравець - дочірньої. Таблиця Гравець також є залежної, оскільки гравець повинен ідентифікуватися й за назвою команди. Залежні таблиці не можуть існувати в базі даних без батьківських. Наявний зв'язок створений шляхом включення поля Команда$Назва як частина первинного ключа таблиці Гравець. Як і в цьому прикладі, залежні таблиці часто включають первинний ключ батьківської таблиці як фрагмент власного первинного ключа.

Команда

Гравець

Назва

номер

Команда$Назва

Місто

Область

Позиція

Початкова_дата

Кінцева_дата

Назва

Рис.2.12. Слабка сутність

Асоціативна таблиця - це дочірня таблиця двох таблиць, які перебувають у відносинах «багато-до-багатьох». Наприклад, у замовленні може бути кілька товарів. Однак певний продукт також може бути присутнім у декількох замовленнях. Тому між замовленням і продуктом існує відношення «багато-до-багатьох», представлене у вигляді асоціативної таблиці LINEITEM. Асоціативна таблиця використовує зовнішні ключі обох батьківських таблиць для складання власного первинного ключа. Щоб скласти свій первинний ключ, таблиця LINEITEM використовує як поле ORDER$id, так і поле PRODUCT$id, як показано на мал. 2.13.

ORDER

id

CUSTOMER$id

xdate

delivery

Wrap

PRODUCT

LINEITEM

Id

ORDER$ID

PRODUCT$id

list_price

ship_method

quantity

SECTION$call_no

sale_price

Рис. 2.13. Первинний ключ асоціативної таблиці