Example: We have a database that holds information about books. A book can have one or many authors, and an author can write one or many books.
Let's take a look at the design.
Notice that the middle table is the bridge table. The bridge table has 2 foreign keys that reference to the Books and Authors table. Basically, we establish an one-to-many relationship between the Books and the bridge table, and an one-to-many relationship between the Authors and the bridge table. Below is the SQL code for create these 3 tables.
CREATE TABLE dbo.Books (
BookId INT NOT NULL PRIMARY KEY,
BookTitle VARCHAR(50) NOT NULL
);
GO
CREATE TABLE dbo.Authors (
AuthorId INT NOT NULL PRIMARY KEY,
LastName VARCHAR(30) NOT NULL,
FirstName VARCHAR(30) NOT NULL
);
GO
--bridge table.
CREATE TABLE dbo.BooksAuthors (
BookId INT NOT NULL FOREIGN KEY REFERENCES dbo.Books(BookId),
AuthorId INT NOT NULL FOREIGN KEY REFERENCES dbo.Authors(AuthorId),
CONSTRAINT BooksAuthors_PK PRIMARY KEY(BookId, AuthorId)
);
GO
--generate some sample data
INSERT INTO dbo.Books (BookId, BookTitle)
VALUES (1, 'Be Happy'),
(2, 'Smiles'),
(3, 'NoSQL 101');
GO
INSERT INTO dbo.Authors (AuthorId, LastName, FirstName)
VALUES (1, 'Preston', 'Ton' ),
(2, 'Phuong' , 'Tran'),
(3, 'Jocelyn', 'Lui' )
GO
-- Let assume:
-- book with title "Be Happy" was written by Preston Ton and Phuong Tran.
-- book with title "Smiles" was written by Phuong Tran and Jocelyn Lui.
-- book with title "NoSQL 101" was written by Jocelyn Lui.
-- Here is the sample data for the bridge table:
INSERT INTO dbo.BooksAuthors (BookId, AuthorId)
VALUES (1, 1),
(1, 2),
(2, 2),
(2, 3),
(3, 3);
GO
--A query to show the all books with all authors.
SELECT b.BookId , b.BookTitle
,a.AuthorId, a.LastName + ', ' + a.FirstName AS AuthorName
FROM dbo.BooksAuthors AS ba
JOIN dbo.Authors AS a ON ba.AuthorId = a.AuthorId
JOIN dbo.Books AS b ON ba.BookId = b.BookId;
One final note: for the bridge table, we can add some other columns if needed.


No comments:
Post a Comment