Я не уверен, что понимаю, что вы имеете в виду под "поэтому требуется 30 дополнительных записей". Вам не нужно вводить все комбинации явно, если они на самом деле не несут информацию. Например, если у вас есть прайс-лист поставщика со всеми ценами, то у вас будет 30 дополнительных строк с новой ценой в каждой. Но это не то, что вы хотите. Похоже, вам нужна запись по бюджетной и последующей стоимости счета для всех предметов, составляющих работу.
Давайте попробуем решить проблему простым способом:
METAL_WIDTH
id | unit | amount | displaytext
1 | mm | 10 | 2/5 in
2 | mm | 15 | 3/5 in
3 | mm | 20 | 4/5 in
4 | mm | 25 | 1 in
5 | mm | 30 | 1 1/5 in
METAL_GAUGE...
TRACK_TYPE...
INSULATION_WIDTH...
INSULATION_TYPE...
я пропустил детали четырех других таблиц, их структура аналогична METAL_WIDTH
JOB
id | name
1 | test job
BUDGET_ITEM
id | job_id | type | metal_width_id | metal_gauge_id | track_type_id | insulation_width_id | insulation_type_id | price_in_dollar
1 | 1 | STUD | 1 | 1 | null | null | null | 50
INVOICE_ITEM
id | job_id | type | metal_width_id | metal_gauge_id | track_type_id | insulation_width_id | insulation_type_id | price_in_dollar
1 | 1 | STUD | 1 | 1 | null | null | null | 49.95
Здесь я сделал отдельные таблицы INVOICE_ITEM и BUDGET_ITEM, потому что я чувствую, что вы, вероятно, захотите использовать INVOICE_ITEM не только для контроля бюджета. Но вы можете выбросить все элементы в одну большую таблицу JOB_ITEMS. Возможно и обратное: вы можете создать таблицу STUD_PRICE, TRACK_PRICE и INSULATION_PRICE. Больше таблиц означает, что запросы становятся длиннее, но теперь вы можете хранить информацию о том, что STUD могут иметь только свойства METAL_GAUGE и METAL_WIDTH:
STUD_PRICE
id | job_id | purpose | metal_width_id | metal_gauge_id | price
1 | 1 | BUDGET | 1 | 1 | 50
2 | 1 | INVOICE | 1 | 1 | 49.95
И теперь вы, вероятно, заметите, что у вас есть избыточность: один и тот же стержень вводится дважды, что станет проблемой, если вы захотите сравнить бюджет и счет-фактуру и иметь более одного стержня в работе:
STUD_PRICE
id | job_id | purpose | metal_width_id | metal_gauge_id | price
1 | 1 | BUDGET | 1 | 1 | 50
2 | 1 | INVOICE | 1 | 1 | 49.95
3 | 1 | BUDGET | 1 | 2 | 75
4 | 1 | INVOICE | 1 | 2 | 89.95
К какому счету сейчас принадлежит БЮДЖЕТ? Вы один опечатка от интересной проблемы. Так что вы, вероятно, лучше с:
STUD_ITEM
id | job_id | metal_width_id | metal_gauge_id | budget_price | invoice_price
1 | 1 | 1 | 1 | 50 | 49.95
2 | 1 | 1 | 2 | 75 | null
где null означает «еще не выставлен счет», и как только вы окажетесь там, вы можете взять таблицы BUGET_ITEM и INVOICE_ITEM сверху и объединить их в JOB_ITEM
JOB_ITEM
id | job_id | type | metal_width_id | metal_gauge_id | track_type_id | insulation_width_id | insulation_type_id | budget_price | invoice_price
1 | 1 | STUD | 1 | 1 | null | null | null | 50 | 49.95
Ваше приложение позволит вам создать новую работу, установить ее атрибуты, а затем добавить элементы в свой бюджет. Вы можете сказать «Новый предмет ...» и выбрать между STUD, TRACK и INSULATION. Выбрав STUD, вы получите меню с разрешенными METAL_WIDTH, другое с разрешенными METAL_GAUGE. Вы выбираете их, устанавливаете бюджетную цену и сохраняете товар. Повторите по мере необходимости. Как только вы доберетесь до стадии выставления счета, вы выбираете сохраненный товар и устанавливаете цену счета. Сравнение бюджета / счета-фактуры выполняется путем просмотра всех позиций в задании, добавления всех бюджетных цен для прогнозируемого общего бюджета и добавления всех счетов-фактур к фактической общей сумме счета-фактуры, с бонусными баллами за то, что они также отображают бюджетную стоимость только для тех позиций, для которых invoice_price не является нулевым.
Чтобы создать текст для счета-фактуры, вам просто нужно объединить содержимое столбцов отображаемого текста, тем самым сохраняя необходимость в строке для каждого из «Стад - 2/5 в - 10га» до «Стад - 1 1/5» в - 18га ". Если вы сейчас добавите METAL_WIDTH, все, что вам нужно сделать, это добавить одну строку в таблицу METAL_WIDTH, и все будет хорошо.