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

Если у меня есть 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

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


person veejay grateja    schedule 01.07.2018    source источник


Ответы (1)


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

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

  1. Книга может принадлежать к 1 или нескольким категориям
  2. В категории может быть 1 или более книг.

Вышеупомянутое можно упростить до «Существует связь «многие ко многим» между книгами и категориями».

В классических механизмах баз данных SQL невозможно реализовать отношение "многие ко многим" непосредственно между двумя таблицами. Это должно быть реализовано отношением 1 ко многим или 0 ко многим между каждой из двух исходных таблиц и новой таблицей, которая используется для перекрестных ссылок на строки исходных двух таблиц. Такие таблицы по-разному называются «таблицей перекрестных ссылок», «таблицей отношений», «таблицей соединений» или «таблицей пересечения».

В вашем случае кажется, что вам нужна таблица для перекрестных ссылок на книги и категории и наоборот.

Это может быть изображено на диаграмме (несколько плохо, так как это сложно изобразить в Stack Overflow) следующим образом:

Book <----- Book_Category -----> Category

or

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)
);

категория таблицы

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)
);
person STLDev    schedule 01.07.2018
comment
Тогда... Вариант 3 - мой лучший вариант? - person veejay grateja; 01.07.2018
comment
Я расширю свой ответ. - person STLDev; 01.07.2018