Может быть довольно просто определить, как сконструировать базу данных, путем тщательного понимания предметной области, изучения обнаруженных вами сущностей и уверенности в том, что вы понимаете отношения между этими сущностями.
Здесь у вас есть две сущности: книга и категория. Похоже, что два правила, которые вы уже определили из проблемного домена:
- Книга может принадлежать 1 или более категориям
- Категория может иметь 1 или более книг
Вышесказанное можно упростить до «Между многими книгами и категориями существует отношение многие ко многим».
В классических движках баз данных SQL невозможно реализовать взаимосвязь «многие ко многим» непосредственно между двумя таблицами. Он должен быть реализован отношением 1-ко-многим или 0-ко-многим между каждой из двух исходных таблиц и новой таблицей, которая используется для перекрестных ссылок на строки исходных двух таблиц. Такие таблицы по-разному называются «таблица перекрестных ссылок», «таблица отношений», «таблица соединений» или «таблица пересечений».
В вашем случае, похоже, вам нужна таблица для перекрестных ссылок на Книги и Категории, и наоборот.
Это может быть схематично (несколько плохо, так как это сложно изобразить в переполнении стека) как:
Book <----- Book_Category -----> Category
или
Book -1-----M- Book_Category -M-----1- Category
Итак, вам нужно ввести ту таблицу Book_Category (с любым именем, которое вы выберете), которая содержит внешний ключ для таблицы Book и внешний ключ для таблицы Category.
Вы можете сделать это так:
tblBookInfo
CREATE TABLE tblBookInfo(
BookId int not null,
Name varchar(50) not null,
CONSTRAINT PK_tblBookInfo PRIMARY KEY CLUSTERED (BookId)
);
tblCategory
CREATE TABLE tblCategory(
CategoryId int not null,
Name varchar(50) not null,
CONSTRAINT PK_tblCategory PRIMARY KEY CLUSTERED (CategoryId)
);
tblBookInfo_Category
CREATE TABLE tblBookInfo_Category(
BookId int not null FOREIGN KEY REFERENCES tblBook(BookId),
CategoryId int not null FOREIGN KEY REFERENCES tblCategory(CategoryId)
);