2011-12-03 6 views
0

내 데이터베이스에는 "books"및 "users"의 두 테이블이 있습니다. 나는 모든 책을 페이지에 표시하고 있으며 사용자가 Facebook의 Like 기능과 비슷한 "I 've 've Read This"링크를 클릭 할 수있는 옵션을 원합니다. 사용자는 책을 읽었거나 클릭하여 책을 "읽지 않은 상태"로 만들 수 있습니다. 로그인 한 다른 사용자는 누가 무엇을 읽었는지 볼 수 있습니다. 나는 내 접근법에 의문을 제기하고 있으며 이와 같은 것을 위해 다른 방향에 대한 피드백을 얻고 싶습니다.페이스 북의 "Like"기능 중복

"users"테이블에 "books_read"와 같은 값을 입력해야했습니다.이 필드에는 값 배열 (book_id)을 저장할 수 있습니다. 모든 책이 표시된 프론트 엔드에서 "books_read"필드를 쿼리하고 현재 book_id와 일치하는 값이 있으면 해당 책 밑에 "User X has read this"와 같은 내용이 표시됩니다.

요약하면 각 사용자가 읽은 책을 수집하기 위해 "사용자"테이블에 "book_id"배열을 저장합니다. 이 배열을 가져 와서 쿼리 된 각 책의 ID를 비교하고, 일치하는 것이 있으면 사용자가 그 책을 읽었 음을 출력합니다.

내가 누락되었거나 깨끗한 접근 방식을 찾지 못했습니까?

답변

1

MySQL과 같은 RDBMS에서 특히 나중에 목록에서 특정 부분을 찾을 것이라는 것을 알고있을 때 필드에 목록을 저장하는 것이 좋습니다. 데이터베이스는이를 통해 인덱스를 이용할 수 없습니다.

대신 사용자와 책을 연결하는 추가 테이블을 만들어야합니다. 선택적으로, * users_books *라고하고 으로 자신의 컬럼으로 옮길 수 있습니다.

users_booksread 
----------- 
user_id 
book_id 
+0

완벽 해이 접근법은 내 마음을 어지럽게했습니다. 더 조직화되어 있습니다. 감사! – cqde

1

아마도 book_read이라고하는 별도의 표를 만듭니다.

사용자가 좋아하는 각 책에 대해 user_idbook_id을 저장하십시오.

그런 다음 지저분한 배열을 처리 할 필요가 없습니다. 모든 것이 정규화되고, 디자인이 더욱 깨끗해지고 데이터베이스가 더욱 유연 해집니다. 또한 사용자 테이블에는 불행한 방법으로 성능에 영향을 줄 수있는 무리한 무리가 없습니다.