Краткий ответ: Вы движетесь в правильном направлении. Это учебный способ создания отношений «многие ко многим».
Однако «машина», вероятно, является просто частным случаем «детали», а именно, той части, которую вы в некотором смысле считаете «законченной вещью» или предметом поставки.
Большинство людей, которые делают это, создают иерархическую структуру. У вас есть:
part(part_id, description, ... maybe other data like size and weight, etc ...)
assembly(parent_part_id, child_part_id)
Тогда деталь верхнего уровня может иметь много составных частей, и каждый из этих компонентов может иметь другие компоненты и т. Д. Преимущество этого состоит в том, что когда сборка используется более чем в одном конечном продукте, вам нужно только прорыв один раз. Например, я работал в компании, которая производила посудомоечные машины. В таблице деталей у нас будет запись, скажем, для модели двигателя 29B. Этот двигатель будет состоять из множества составных частей - корпуса, ротора, статоров, электропроводки и т. Д. Но один и тот же двигатель может использоваться в нескольких разных моделях посудомоечной машины. Вам не нужно заново указывать полный список деталей для двигателя для каждой посудомоечной машины, на которой он используется. Мало того, что кому-то неудобно печатать, но если вы когда-либо вносите изменения, вы должны быть уверены, что изменяете их везде, где они используются. Таким образом, вы просто даете один раз пробой для двигателя, а затем ссылаетесь на двигатель как на единицу во всех сборках более высокого уровня.
Да, некоторые детали являются "окончательными", то есть они не идут на сборку более высокого уровня. Но вам не нужен другой стол для этого. Это просто означает, что для этой конкретной детали нет записи Ассамблеи, где находится этот дочерний элемент.
Запчасти есть части. Положите их все в один стол.
Некоторые движки баз данных, например Oracle, есть команды, чтобы преследовать иерархию, как это. Если у вас нет, вам придется сделать это в коде. Но это не так сложно. Люди делают это постоянно.