Поскольку ваши продукты и рецепты хранятся отдельно и, по-видимому, в большинстве своем имеют отдельные столбцы, то, вероятно, правильный подход - использовать отдельные таблицы инвентаризации.Например,
CREATE TABLE dbo.ProductInventory
(
Product_id INT NOT NULL,
[count] INT NOT NULL,
CONSTRAINT FK_ProductInventory__Product_id FOREIGN KEY (Product_id)
REFERENCES dbo.Product (Product_id)
);
CREATE TABLE dbo.RecipeInventory
(
Recipe_id INT NOT NULL,
[count] INT NOT NULL,
CONSTRAINT FK_RecipeInventory__Recipe_id FOREIGN KEY (Recipe_id)
REFERENCES dbo.Recipe (Recipe_id )
);
Если вам нужно объединить все типы, вы можете просто использовать представление:
CREATE VIEW dbo.Inventory
AS
SELECT Product_id AS item_id,
2 AS item_type_id,
[Count]
FROM ProductInventory
UNION ALL
SELECT recipe_id AS item_id,
1 AS item_type_id
[Count]
FROM RecipeInventory;
GO
Если вы создаете новый item_type, то вам все равно нужно изменить дизайн БД, чтобысоздайте новую таблицу, так что вам просто нужно будет одновременно изменить представление
Другая возможность - это иметь одну таблицу «Предметы», а затем сделать ссылку «Продукты / рецепты» на это.Итак, вы начинаете с таблицы элементов, каждая из которых имеет уникальный идентификатор:
CREATE TABLE dbo.Items
(
item_id INT IDENTITY(1, 1) NOT NULL
Item_type_id INT NOT NULL,
CONSTRAINT PK_Items__ItemID PRIMARY KEY (item_id),
CONSTRAINT FK_Items__Item_Type_ID FOREIGN KEY (Item_Type_ID) REFERENCES Item_Type (Item_Type_ID),
CONSTRAINT UQ_Items__ItemID_ItemTypeID UNIQUE (Item_ID, Item_type_id)
);
Обратите внимание на уникальный ключ, добавленный в (item_id, item_type_id)
, это важно для ссылочной целостности позже.
Тогда каждая из ваших вложенных таблиц имеет отношение 1: 1 с этим, поэтому ваша таблица продуктов будет иметь вид:
CREATE TABLE dbo.Products
(
item_id BIGINT NOT NULL,
Item_type_id AS 2,
name VARCHAR(50) NOT NULL,
Price DECIMAL(10, 4) NOT NULL,
InStock BIT NOT NULL,
CONSTRAINT PK_Products__ItemID PRIMARY KEY (item_id),
CONSTRAINT FK_Products__Item_Type_ID FOREIGN KEY (Item_Type_ID)
REFERENCES Item_Type (Item_Type_ID),
CONSTRAINT FK_Products__ItemID_ItemTypeID FOREIGN KEY (item_id, Item_Type_ID)
REFERENCES dbo.Item (item_id, item_type_id)
);
Несколько замечаний:
item_id
isснова первичный ключ, обеспечивающий соотношение 1: 1. - вычисляемый столбец item_type_id (как 2), гарантирующий, что все item_type_id установлены в 2. Это ключ, поскольку он позволяет добавить ограничение внешнего ключа
- внешний ключ на
(item_id, item_type_id)
вернуться к таблице предметов.Это гарантирует, что вы можете вставить запись в таблицу продуктов только в том случае, если исходная запись в таблице товаров имеет item_type_id, равный 2.
Третьим вариантом будет отдельная таблица для рецептов и продуктов исделать любые столбцы не обязательными для обоих обнуляемых. Этот ответ о типах наследования стоит прочитать.