Partially Dependent Scenario:
Items Table
ItemID NOT NULL
ItemName NOT NULL
CategorySubcategoryID NOT NULL
Category Table
CategoryID NOT NULL
CategoryName NOT NULL
PK CategoryID
SubCategory Table
SubcategoryID NOT NULL
SubcategoryName NOT NULL
PK SubcategoryID
UNIQUE KEY SubcategoryName
CategorySubCategory Table
CategorySubCategoryID NOT NULL
CategoryID NOT NULL
SubcategoryID NULL
PK CategorySubCategoryID
UNIQUE KEY SubcategoryID, SubcategoryID
Totally Dependent Scenario
Items Table
ItemID NOT NULL
ItemName NOT NULL
SubcategoryID NOT NULL
PK ItemID
Category Table
CategoryID NOT NULL
CategoryName NOT NULL
PK CategoryID
SubCategory Table
SubcategoryID NOT NULL
CategoryID NOT NULL
SubcategoryName NULL
PK SubcategoryID
UNIQUE KEY CategoryID, SubcategoryName
Totally Independent Scenario
Partially Dependent Scenario:
Items Table
ItemID NOT NULL
ItemName NOT NULL
CategoryID NOT NULL
SubcategoryID NULL
Category Table
CategoryID NOT NULL
CategoryName NOT NULL
PK CategoryID
SubCategory Table
SubcategoryID NOT NULL
SubcategoryName NOT NULL
PK SubcategoryID
UNIQUE KEY SubcategoryName
--Totally Dependent Scenario
-- ItemCategorization => Categorization => SubCategory
-- ItemCategorization => Items
-- Items => (1 to Many) ItemCategorization => (1 to Many) Categorization => (1 to 0/Many) SubCategory
CREATE TABLE Items
(
ItemID INT IDENTITY (1,1) PRIMARY KEY,
ItemName VarChar(50) UNIQUE NOT NULL,
);
CREATE TABLE Categorization
(
CategorizationID INT IDENTITY (1,1) PRIMARY KEY,
CategoryName VarChar(50) NOT NULL,
SubCategoryID INT NULL
);
CREATE TABLE SubCategory
(
SubCategoryID INT IDENTITY (1,1) PRIMARY KEY,
SubCategoryName VarChar(50) UNIQUE NOT NULL,
);
CREATE TABLE ItemCategorization
(
ItemID INT NOT NULL,
CategorizationID INT NOT NULL
);
CREATE PRIMARY KEY PK_ItemCategorization
ON ItemCategorization(ItemId, CategorizationID);
CREATE UNIQUE INDEX IX_Categorization_Subcategory
ON Categorization(SubcategoryName, SubCategoryID)
INCLUDE (CategorizationID ) WITH IGNORE_DUP_KEY;
ALTER TABLE Categorization
ADD CONSTRAINT FK_CategorizationSubCategoryID FOREIGN KEY (ItemID)
REFERENCES ITEM(ItemID);
ALTER TABLE Item
ADD CONSTRAINT FK_ItemCategorization FOREIGN KEY (CategorizationID)
REFERENCES Categorization(CategorizationID);
ALTER TABLE Item
ADD CONSTRAINT FK_ItemCategorization FOREIGN KEY (CategorizationID)
REFERENCES Categorization(CategorizationID);
columns: id, name
table: item
columns id, name
table: item_categories
columns: id_item, id_category
table: category_categories
columns: id_category_parent, id_category_child
you could eventually "merge" the last table into the categories table directly, by this the table would self-reference itself.