Вы всегда должны начинать с разработки таблиц в третьей нормальной форме (3NF).Вполне приемлемо вернуться к меньшим формам (обычно по соображениям производительности), если вы понимаете и смягчаете воздействие, но начинайте с 3NF.
(немного упрощенное) правило, которое нужно помнить, состоит в том, что каждыйнеключевой столбец в таблице должен зависеть от:
- ключа,
- всего ключа
- и только от ключа
- «Помоги мне, Кодд» - немного юмора DBA (и я имею в виду «мало»).
Первый вопрос довольно прост.
Один ко многимотношения лучше всего представлены как внешний ключ в таблице «многие».Поэтому то, что вы предлагаете, имеет смысл.Это позволяет автоматически ограничивать отношения.Если бы у вас была отдельная таблица присоединения (использовалась для многих ко многим), вам пришлось бы прибегнуть к «хитрости», чтобы навязать отношение «один ко многим».
Что касается вашего второго вопроса, вам нужновзгляните на правило «Кодд» выше и подумайте: что именно представляют эти строки в каждой таблице?Если действие рабочего элемента является отдельным объектом от рабочего элемента (они могут быть связаны , но, если они не представляют один и тот же объект, они различаются), они должны быть в разных таблицах.
Кроме того, похоже, что у вас есть отношение один ко многим (один элемент может иметь много действий), поэтому они должны быть в разных таблицах только по этой причине.
Что касается вашего запросана избыточной информации: если они действительно являются избыточными, их следует исправить.
Используя step_num
в качестве примера, что именно это представляет?Если это атрибут рабочего элемента , то его вообще не должно быть в таблице action .
Вы бы от него избавились и,если вы хотите узнать номер шага для строки в таблице рабочих действий, вы должны объединиться с таблицей рабочих элементов с помощью внешнего ключа.
Если вместо этого это атрибут рабочего действия, его следует удалитьиз таблицы рабочих элементов, так как это не имеет смысла.У вас может быть два действия, каждое с различным номером шага, так что бы в этом случае был номер шага родительского элемента?
Конечно, у вас может быть отдельный номер шага для обоихдействия и - в этом случае, я бы рассмотрел переименование, чтобы прояснить намерение, что-то вроде item_step_num
и action_step_num
.
. Нижняя строка должна начинаться с 3NF.Если в какой-то момент ваша база данных работает слишком медленно, , тогда рассмотрите возможность возврата в меньшую форму.Затем вы можете задать еще один вопрос здесь о том, как распознать и смягчить проблемы, которые возникают из-за этого (например, возможность несогласованности данных в двух местах и использование триггеров для предотвращения этого).