Если у меня есть tblBookInfo (bookId, title ... и т. Д.), И я хочу, чтобы в нем был столбец категорий, каков наилучший способ сделать это? - PullRequest
0 голосов
/ 01 июля 2018

Если у меня есть tblBookInfo (bookId, title ... и т. Д.), И я хочу, чтобы в нем был столбец категорий, каков наилучший способ сделать это?

Вариант 1

Таблица

категорий будет иметь FK, связанный с bookId, подобным этому

tblBookInfo
bookId     title
1          test title
2          test title 2
tblCategories
bookId     name
1          Science fiction
1          Mystery
1          Horror
2          Science fiction
2          Mystery

В этом случае название категории будет повторяться много раз, и это уродливо

Вариант 2

Храните массив int в btlBookInfo следующим образом

tblBookInfo
bookId     title          categories
1          test title     [1,2,3]
2          test title 2   [1,2]

Я слышал, что хранение массива в столбце - не самая лучшая практика, как и просили здесь

Вариант 3

Оставьте таблицу категорий такой, какая она есть

tblCategories
id     name
1      Science finction
2      Mystery
3      Horror

И добавить FK в tblBookInfo вот так

tblBookInfo
bookId     title          categoryId
1          test title     1
2          test title 2   2

Наконец, добавьте еще одну таблицу, которая связывает их с таблицами, подобными этой

tblCategoryAdapter
bookId     categoryId
1          1
1          2
1          3
2          1
2          2

Теперь мне не нужно повторять название категории, но я не думаю, что это нормально

1 Ответ

0 голосов
/ 01 июля 2018

Может быть довольно просто определить, как сконструировать базу данных, путем тщательного понимания предметной области, изучения обнаруженных вами сущностей и уверенности в том, что вы понимаете отношения между этими сущностями.

Здесь у вас есть две сущности: книга и категория. Похоже, что два правила, которые вы уже определили из проблемного домена:

  1. Книга может принадлежать 1 или более категориям
  2. Категория может иметь 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)
);
...