0

データベースのレイアウトを概念化しようとしていますが、「理論」に関する質問があります。たとえば、次のようなシステムがあります。

  • ユーザー

本は一意ではありません。たとえば、アリス、ボブ、カールはすべて白鯨のコピーを持っている可能性があります。また、各ユーザーは多くの本を持つことができます。これは、私がかなりよく理解している単純な多対多の関係です。しかし、アリスの特定の Moby Dick のコピーに関する情報はどこに保存すればよいでしょうか?

私は最終的に次のことを実行できるようにしたいと考えています: - Moby Dick のコピーを持っているすべてのユーザーを見つける - 本の個々の「インスタンス」に関する情報を変更する: Alice の Moby Dick のコピーは「貸し出されている」 - 変更/追加本の情報 (つまり、みんなのコピー): Moby Dick に出版社情報を追加します。

これを効率的にレイアウトする方法がわかりません。本のテーブルを 1 つ、ユーザーのテーブルを 1 つ、n 人のユーザーのテーブルを n 個持つことができ、それぞれにコレクションに関する情報が含まれています。Moby Dick のコピーを持っているすべての人を見つける必要がある場合、これは遅くなるようです。どんな提案も役に立ちます。

4

1 に答える 1

0

それが図書館データベースであると仮定して、私は以下の設計から始めます。テーブル:

  1. ユーザー(本のコピーを借りる人)
  2. 書籍(書籍、タイトル、著者などに関する基本情報...このレベルの情報は論理的です)
  3. 本のコピー(これは物理的に印刷された本の情報を保存します)
  4. ユーザーブックローン(本のどのコピーを借りたのか)

このテーブル構造により、

  1. 本には多くの本のコピーを含めることができ、それぞれを識別することができます。
  2. 1人のユーザーが多くの本のコピーを持つことができます

理解を深めるために、ここにいくつかの疑似SQLコードがあります。

「MobyDickのコピーを持っているすべてのユーザーを検索する」

SELECT users.user_name
  FROM users u, "user book loans" ubl, "book copies" bk, books b
 WHERE 1 = 1
   AND b.book_name = "Moby Dick"--find book
   AND b.book_id = bk.book_id--find copies of that book
   AND bk.book_copy_id = ubl.book_copy_id--find loan info for the book copy
   AND ubl.user_id = u.user_id--find user who borrowed the copy

上記のクエリはテーブルの構造を説明していると思います。書籍のコピーに公開された日付、書籍の著者に関する情報、使用期間を追跡するためのユーザーブックローンの日付フィールドなどの属性を追加できます。

于 2013-01-17T13:16:02.913 に答える