Нормализация базы данных является руководящим принципом для разработки эффективных, полезных таблиц и отношений в реляционной базе данных.Формы доступа, подчиненные формы, отчеты и т. Д. Требуют, чтобы должным образом нормализованные таблицы работали, как предполагалось.Существуют различные уровни нормализации, но общая идея состоит в том, чтобы избежать дублирования данных между строками и столбцами данных.Наличие дублирующихся данных требует больших затрат памяти и гарантирует, что действия с базой данных не создадут противоречивые состояния (противоречивые значения данных).Хорошо нормализованные таблицы позволяют определять полезные ограничения между столбцами данных и / или строками, чтобы обеспечить достоверность данных.
Таблица [BoM], предложенная в вопросе, не нормализована.Но прежде чем мы перейдем к этому, ParentID не был определен, и неясно, что он представляет.Вместо этого, чтобы показать, почему он не нормализован, позвольте мне добавить столбец [Product] в таблицу [BoM].Тогда, если у такого дескриптора есть два альтернативных списка компонентов (призраки?), Таблица будет выглядеть так:
BOMID, Product, GhostID
----- ------- -------
1 Handle 1
1 Handle 2
Видите дублирование?И теперь, если продукт переименован, например, в «Бронзовый дескриптор», необходимо обновить обе строки для одного концептуального элемента.Это также вводит возможность наличия противоречивых данных, таких как
BOMID, Product, GhostID
----- ------- -------
1 Handle 1
1 Bronze Handle 2
. Об этом достаточно сказано, поскольку я уже слишком много говорил о понятиях нормализации здесь.Ниже приведена базовая нормализованная схема, которая будет вам полезнее, но обратите внимание, что она не слишком отличается от того, что вы предложили в вопросе.Единственное реальное отличие состоит в том, что таблица BoM нормализуется путем разбиения ее столбцов (и цели) на другую таблицу.
Я не перечисляю здесь все столбцы, только первичные и внешние ключи и несколько других значимых столбцов.PK = первичный ключ (уникальный, ненулевой ключ), FK = внешний ключ.Надлежащие индексы должны быть определены в столбцах PK и FK И взаимосвязи, определенные с соответствующими ограничениями.
Table: [IM_Item_Registry]
Item_Code (PK)
Table: [BOM]
BOMID (PK)
ProductID (FK)
Table: [BOM_Option]
OptionID (PK)
BOMID (FK)
Primary (boolean) - flags the primary/usual list of components
Description
Table: [Option_Items]
OptionID (FK; part of composite PK)
Item_Code (FK; part of composite PK)
Inclusion_Rate
Столбец [BOM].[ProductID]
ссылается на другую таблицу с подробной информацией о продукте, которая должна определяться отдельно от ведомостиМатериал.Если эта база данных действительно упрощенная, то это может быть просто строковое поле [Product]
, содержащее имя, но я предполагаю, что есть более полезные детали для хранения.Возможно, это то, на что намекает ParentID
?(Я предлагаю выбирать не столь абстрактные имена, как «родитель» и «призрак», поэтому я выбрал слово «опция».)
Действительно, поскольку [BOM_Option]
следует ограничить одним параметромСпецификация будет выполнять надлежащую нормализацию для создания другой таблицы, такой как
Table: [BOM_Primary]
[BOMID] (FK and PK) - Primary key so only one primary option can be defined at once
[OptionID] (FK)