如果我有 tblBookInfo(bookId、title...等)并且我希望它有类别列,那么最好的方法是什么?

If I have tblBookInfo (bookId, title... etc.) and I want it to have categories column, what is the best way to do it?

如果我有 tblBookInfo(bookId、title...等)并且我希望它有类别列,最好的方法是什么?

选项 1

类别table 将像这样与 bookId 相关的 FK

tbl图书信息
bookId     title
1          test title
2          test title 2
tbl类别
bookId     name
1          Science fiction
1          Mystery
1          Horror
2          Science fiction
2          Mystery

这样的话,类目名称会重复很多次,很难看

选项 2

像这样在 btlBookInfo 中存储一个 int 数组

tbl图书信息
bookId     title          categories
1          test title     [1,2,3]
2          test title 2   [1,2]

我听说在列中存储数组不是所问的最佳做法

选项 3

保持类别table原样

tbl类别
id     name
1      Science finction
2      Mystery
3      Horror

并像这样将 FK 添加到 tblBookInfo

tbl图书信息
bookId     title          categoryId
1          test title     1
2          test title 2   2

最后,添加另一个 table,将它们链接到 table,就像这样

tblCategory适配器
bookId     categoryId
1          1
1          2
1          3
2          1
2          2

现在类目名称不用重复了但是我觉得不正常

通过透彻了解问题域、检查您发现的实体并确保您了解这些实体之间的关系,可以非常简单地确定如何构建数据库。

这里有两个实体:书籍和类别。您已经从问题域中确定的两条规则似乎是:

  1. 一本书可以属于 1 个或多个类别
  2. 一个类别可以有 1 本或多本图书

以上可以简化为"There exists a many-to-many relationship between Books and Categories."

在经典的 SQL 数据库引擎中,不可能直接在两个 table 之间实现多对多关系。它必须通过两个原始 table 和用于交叉引用行的新 table 之间的一对多或 0 对多关系来实现原来两个table。这样的 table 被称为 "cross-reference table"、"relationship table"、"join table" 或 "intersection table"。

在您的情况下,您似乎需要 table 将图书与类别交叉引用,反之亦然。

这可能会被绘制成图表(有点糟糕,因为在 Stack Overflow 中很难绘制):

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

Book -1-----M- Book_Category -M-----1- Category

所以你需要引入那个 Book_Category table(随便你选什么名字),它包含一个指向 Book table 的外键和一个指向 Category 的外键table.

你可以这样做:

tblBookInfo

CREATE TABLE tblBookInfo(
    BookId int not null,
    Name varchar(50) not null,
    CONSTRAINT PK_tblBookInfo PRIMARY KEY CLUSTERED (BookId)
);

tbl类别

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