0

次のシナリオがあるとしましょう。2 つのLocalLibraryテーブルBooksReaders

| BookID|  Title   | Author | 
-----------------------------
|  1    | "Title1" | "John" | 
|  2    | "Title2" | "Adam" | 
|  3    | "Title3" | "Adil" |
------------------------------

そして、リーダーテーブルは次のようになります。

| UserID| Name | 
-----------------
|  1    | xy   L  
|  2    | yz   | 
|  3    | xz   | 
----------------

ここで、ユーザーが読んだ本のリストを作成できるとしましょう (上記の著者の本のみを厳密に含む本棚、つまり私たちの Db の著者)。では、その本棚をデータベースで表現する最良の方法は何ですか。

私の最初の考えは、 テーブルBookID内のカンマ区切りのリストでした。Readersしかし、リレーショナル Db にとっては明らかに厄介に思えます。また、ユーザーの書籍のリストを表示するたびに分割する必要があります。また、ユーザーが新しい本を棚に追加するとき、カンマ区切りのリストを分割して 2 つの ID を比較する以外に、その本が棚に既に存在するかどうかを確認する方法はありません。削除も簡単ではありません。

したがって、ある行では、問題は、このような状況をどのように適切にモデル化するかです。MySQL では単純な SELECT と INSERT 以外は何もしていません。より簡単な言葉で説明し、さらに読むためのリンクを提供していただけると、非常に役に立ちます。

さらに説明が必要な場合はコメントしてください。

4

1 に答える 1

2

Readers テーブルに追加する書籍のコンマ区切りリストについての考えは絶対に忘れてください。検索できず、非常に不器用になります。Books テーブルと Readers テーブルを結合する 3 つ目のテーブルが必要です。このテーブルの各レコードは、本を読んでいる読者を表しています。

Table ReaderList
--------------------
UserID | BookID    |
--------------------

特定のユーザーが読んだ本のリストを取得します

select l.UserID, r.Name, l.BookID, b.Title, b.Author
from ReaderList l left join Books b on l.BookID = b.BookID
     left join Readers r on l.UserID = r.UserID
where l.UserID = 1

ご覧のとおり、このパターンでは、2 つ以上のテーブルからデータをまとめるキーワード JOIN を使用する必要があります。JOIN の詳細については、この記事
を参照して ください。必要に応じて、このモデルを拡張して、ReadingDate などの別のフィールドを ReaderList に追加できます。

于 2012-09-23T16:56:23.010 に答える