2012-11-29 3 views
0

나는이 문제에 큰 뇌의 방구를 가지고있다. 나는 누군가 이것을 보면서 이것을 어떻게하는지에 대한 단서를 줄 수 있기를 바란다.Mysql 많은 테이블과 쿼리

나는 users, book_copies, library locations, book 등 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)); 

나는 내가 뭘하고 싶은 것은 모든 추적 복사되는 많은 많은 테이블

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

를 추가로 book_copies 및 위치, bookcopies 사용자, 책과 책의 사본 사이에 많은 많은 관계를 가지고 책을 읽고, 어떤 위치에 있는지, 그리고 어떤 사용자가 그것을 체크 아웃했는지, 그리고 어떤 날짜를 말합니까?

내가 해리 포터의 두 사본이 있다는 것을 돌아 내가 쿼리를 만들 것입니다 방법

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 일에 체크 아웃 얀 11 때문에, 건강 과학 공공 도서관에있는 ?

테이블을 여러 개의 테이블로 설정하는 것이 맞습니까? 내가해야 할 또 다른 방법이 있니?

+2

주요 질문 외에도 스키마 디자인이 그렇게 나쁘지 않다고 생각합니다. 'book_copies' 데이터를 다르게 저장하고 복사본 당 하나의 항목을 저장하는 것이 좋습니다. 테이블은 (id, book_id, copy_id) 또는 (id, book_id)와 같을 것입니다. –

+1

James가 말했던 것 외에도 날짜를 'DATE'유형으로 저장하는 것이 좋습니다. 많은 레코드를 가져 오면 테이블이 훨씬 작아지고 인덱싱이 훨씬 효율적입니다. –

+0

'book_copies_locations'도 문제가 있습니다. 이 설정으로 서적이 여러 위치에있을 수 있습니다. 해당 테이블에 UNIQUE (bookcopid) 제약 조건을 추가해야합니다. –

답변

0

오히려이 같은 스키마를 볼 것 : 주어진 책의 사본을 계산

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

하는 것으로, 당신은 book_copy에 봐. 귀하의 예에서는 book_id = 1에 대해 두 행이 있습니다.

status은 체크 아웃 기록에서 최신 상태를 확인할 필요가 없도록 비정규 값입니다.

사용자는이 책의 사본 체크 아웃 :

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

userlocation 테이블에 추가를, 당신은 모든 설정해야합니다.

다른 사람들도 지적했듯이 고유 색인을 올바르게 설정하십시오.