Винаги трябва да започвате с проектиране на вашите таблици в трета нормална форма (3NF). Напълно приемливо е да се върнете към по-малки форми (обикновено от съображения за ефективност), при условие че разбирате и смекчавате въздействието, но започнете с 3NF.
(Леко опростеното) правило, което трябва да запомните, е, че всяка неключова колона в таблица трябва да зависи от:
- ключът,
- целият ключ,
- и нищо освен ключа,
- „така че помогни ми, Код“ – малко DBA хумор (и имам предвид „малко“).
Първият въпрос е доста прост.
Отношенията "един към много" са най-добре представени като външен ключ в таблицата "много". Така че това което предлагаш е разумно. Тя ви позволява автоматично да ограничите връзката. Ако сте имали отделна таблица за присъединяване (използвана за много към много), ще трябва да прибегнете до „измама“, за да наложите връзката един към много.
Що се отнася до втория ви въпрос, трябва да погледнете правилото "Код" по-горе и да си помислите:какво точно представляват тези редове във всяка таблица? Ако действието на работен елемент е отделен обект от работен елемент (те може да са свързани но ако не представляват един и същ обект, те са различни), трябва да са в различни таблици.
Освен това изглежда, че имате връзка "един към много" там (един елемент може да има много действия), така че те трябва да са в различни таблици само поради тази причина.
Що се отнася до вашето запитване относно излишната информация:ако наистина са излишни, те трябва да бъдат поправени.
Използване на step_num
като пример, какво точно представлява това? Ако това е атрибут на работния елемент, не трябва да е в работното действие таблица изобщо.
Ще се отървете от него оттам и, ако искате да знаете номера на стъпката за ред в таблицата на работните действия, ще се присъедините към таблицата на работните елементи, като използвате външния ключ.
Ако вместо това е атрибут на работното действие, трябва да го премахнете от таблицата с работни елементи, тъй като няма смисъл. Може да имате две действия, всяко с различен номер на стъпка, така че какъв ще бъде номерът на стъпката на родителския елемент в този случай?
Разбира се, може да имате различен номер на стъпка за двата елемента и действия - в такъв случай бих обмислил преименуване, за да стане ясно намерението, нещо като item_step_num
и action_step_num
.
В крайна сметка трябва да започнете с 3NF. Ако в даден момент вашата база данни работи твърде бавно, тогава помислете за връщане към по-малка форма. След това можете да попитате друг въпрос тук за това как да разпознаете и смекчите проблемите, които възникват от това (например възможността за непоследователни данни на две места и използване на тригери за предотвратяване на това).