2011-12-03 7 views
0

私のデータベースには2つのテーブル: "books"と "users"があります。私はページ上のすべての書籍を表示しており、FacebookのLike機能と同様のステータスを持つ「これを読んだ」という小さなリンクをユーザーがクリックするオプションを希望します。ユーザーはブックを読んだことをクリックするか、ブックを「未読」にするためにクリックを解除することができます。ログインした他のユーザーは、誰が何を読んだのかを見ることもできます。私は私のアプローチに疑問を抱き、このようなことをするために他の方向へのフィードバックを得たいと考えています。Facebookの "Like"機能を複製

私が気にしていたのは、 "users"テーブルにフィールドを持つことでした。 "books_read"のようなもので、値の配列(book_id)を格納します。すべての書籍が表示されているフロントエンドでは、 "books_read"フィールドにクエリを行い、値が現在のbook_idと一致すると、その書籍の下に "User X has read this"のようなものが表示されます。要するに、 "users"テーブルに "book_id"の配列を格納して、各ユーザーが読んだ書籍を収集します。私はこの配列を取得し、照会された各書籍にIDを比較し、一致するものがあれば、その書籍を読んだことを出力します。

私は何かが不足しているか、よりクリーンなアプローチを見ていないでしょうか?

答えて

1

MySQLなどのRDBMSでは、特に後でリスト内の特定の部分を探していることがわかっているときに、フィールドにリストを格納することはめったにありません。これを行うことで、データベースはインデックスを利用できません。

代わりに、ユーザーと書籍をリンクする追加の表を作成する必要があります。任意で、それを* users_books *と呼び、と読み替えることで、独自の列に移動することができます。

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

完璧な、このアプローチは私の心を滑った。より組織化されています。ありがとう! – cqde

1

おそらくbook_readと呼ばれる別のテーブルを作成します。

その中で、ユーザーが好きな書籍ごとにuser_idbook_idを保存します。

あなたは扱いにくい配列を持たず、すべてが正規化され、デザインがより洗練され、データベースはより柔軟になります。さらに、あなたのユーザーテーブルには不幸な方法でパフォーマンスに影響を与える余分な骨がたくさんあります。

関連する問題