Да, вы не можете сформировать третью-нормальную форму отношения многие ко многим между двумя таблицами только с этими двумя таблицами. Вы можете сформировать один ко многим (в одном из двух направлений), но чтобы получить истинное множество ко многим, вам нужно что-то вроде:
Item
id primary key
description
Category
id primary key
description
ItemCategory
itemid foreign key references Item(id)
categoryid foreign key references Category(id)
Вам не нужна категория в таблице Предметов, если у вас нет какой-либо привилегированной категории для предмета, который, кажется, не имеет место здесь. Я также не большой поклонник введения ненужных первичных ключей, когда на присоединяемой таблице уже есть «настоящий» уникальный ключ. Тот факт, что идентификаторы элементов и категорий уже являются уникальными, означает, что вся запись для таблицы ItemCategory также будет уникальной.
Просто следите за производительностью таблицы ItemCategory с помощью ваших стандартных инструментов. Вам может потребоваться индекс по одному или нескольким из:
- Itemid
- CategoryID
- (Itemid, CategoryID)
- (CategoryID, Itemid)
в зависимости от запросов, которые вы используете для объединения данных (и один из составных индексов будет первичным ключом).
Фактический синтаксис для всей работы будет выглядеть следующим образом:
create table Item (
id integer not null primary key,
description varchar(50)
);
create table Category (
id integer not null primary key,
description varchar(50)
);
create table ItemCategory (
itemid integer references Item(id),
categoryid integer references Category(id),
primary key (itemid,categoryid)
);
Есть и другие вещи, которые вы должны учитывать, такие как превращение столбцов идентификаторов в столбцы идентификаторов / автоинкрементов, но это не имеет прямого отношения к рассматриваемому вопросу.