2016-09-09 4 views
0

я в настоящее время есть таблица, в которой хранятся материалы, используемые для создания элементаНормализация таблицу с тесно связанных данных

Item (material1, material2, material3) 

Другой материал, недавно был добавлен. Тем не менее, я хочу нормализовать эту таблицу, чтобы в будущем для добавления нового материала не потребуется новый столбец для добавления в базу данных. Я извлек материалы в следующий соединительный стол

ItemJuncMaterial (id, itemId, materialid) 

Однако улов в том, что порядок материалов имеет значение. Так что этот узел таблицы не позволит мне запустить этот запрос, основанный на материалах, чтобы получить деталь

select itemid from ItemJunMaterial where materialid in (1,2,3) 

Это может вернуть элементы, которые используют 2,3,1 или даже использовать два материала 1,2. Есть ли лучший способ разделить эту таблицу, чтобы нормализовать ее и сделать ее более динамичной?

ответ

0

Вы должны рассмотреть образец «спецификации материалов» (BOM) (см. here или here). Пересечение спецификации может включать дополнительную информацию о составе, такую ​​как количество каждого компонента. Вы легко можете легко включить последовательность или приоритет компонента в этом пересечении.

+0

Моя единственная забота о последовательности - это поиск элемента, который вам нужно написать 'select Itemid из ItemJunMaterial, где matieralID = 1 и sequence = 1 и materialid = 2 и sequence = 2 etc..', но если это путь, то это то, что я должен сделать – Brandon

+0

@ bme2010 Да, вам нужно использовать первичный ключ при выборе отдельных записей. Если этот первичный ключ является составным, тогда вам нужно 'и' в предложении 'where'. Будете ли вы так много делать? Как часто вы будете выбирать полный список? В вашей структуре 0NF 'Item (material1, material2, material3)' вы получаете весь список с одним выбором. В вашей полу-нормированной структуре вы также получаете весь список, используя 'where materialid в (1,2,3)'. –