0

私はこの問題について大きな脳のおならを抱えています。誰かがこれを見て、これを行う方法についての手がかりを与えてくれることを願っています.

ユーザー、book_copies、図書館の場所、書籍の 4 つのテーブルがあります。

Create table book 
( id int not null auto incre, 
  name varchar(55), 
primary key(id) );

Create table book_copies 
( id int not null auto incre, 
  number of copies), 
primary key(id) );

Create table location 
( id int not null auto incre, 
  address varchar(55), 
primary key(id) );

Create table users 
( id int not null auto incre, 
  name varchar(55), 
primary key(id) );

book_copies と場所、bookcopies とユーザー、book と book のコピーの間に多対多テーブルを追加して多対多の関係があります。

Create book_copies_locations 
( locationid int (11) not null, 
  bookcopyid int (11) not null, 
primary key(locationid,bookecopyid) , 
foreign key (locationid) references locations.id, 
foreign key (bookcopyid) references book_copies.id) );

Create table borrow 
( userid int (11) not null, 
  bookcopyid int (11) not null, 
  checkoutdate varchar(55), 
  duedate varchar(55), 
primary key(userid,bookecopyid) , 
foreign key (userid) references users.id, 
foreign key (bookcopyid) references book_copies.id) );

Create table book_copies_books 
( booksid int (11) not null, 
  bookcopyid int (11) not null, 
  checkoutdate varchar(55), 
  duedate varchar(55), 
primary key(booksid,bookecopyid) , 
foreign key (booksid) references books.id, 
foreign key (bookcopyid) references book_copies.id) );

私がやりたいことは、すべての本のコピーを追跡し、それがどの場所にあるのか、どのユーザーがチェックアウトしたのか、いつの日付なのかを知ることです。

私は次のようなものを追加しました

insert into borrow (userid,bookcopyid, checkoutdate, duedate) values( '1', '1', 'dec 18', 'jan 11')

insert into users (id,name) values( '1', 'bob')

insert into book_copies (id,number_of_copies) values( '2', '33')

insert into books (id,name) values( '1', 'harry potter')

insert into locations (id,address) values( '1', 'health science public library')

12 月 18 日にチェックアウトされ、1 月 11 日に期限が切れ、健康科学公共図書館に所蔵されているハリー ポッターの 2 つのコピーがあることを返すクエリを作成するにはどうすればよいですか?

多対多のテーブルでテーブルを正しく設定していますか? これを行うべき別の方法はありますか?

4

1 に答える 1

0

私はむしろあなたのスキーマをこのように見たいです:

book (id, name)
book_copy (id, location_id, book_id, status)

特定の本のコピーを数えるには、book_copyを調べることに注意してください。この例では、book_id=1の場合に2つの行があります。

statusチェックアウト履歴から最新のステータスを判別する必要がないように、非正規化された値になります。

次に、ユーザーは本のコピーをチェックアウトします。

book_checkout (id, user_id, book_copy_id, checkout_date, due_date)

userとテーブルを追加するとlocation、すべて設定されます。

他の人が指摘しているように、UNIQUEインデックスを適切に設定してください。

于 2012-11-30T05:35:17.223 に答える