如果我有 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 本或多本图书
以上可以简化为"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)
);
如果我有 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 本或多本图书
以上可以简化为"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)
);