2013-01-17 65 views
0

我想概念化數據庫佈局,我有一個「理論」的問題。我有一個具有例如一個系統:數據庫結構的一般和具體數據

  • 用戶

書是不是唯一的,比如愛麗絲,鮑勃和卡爾都可以擁有白鯨的副本。另外,每個用戶可以有很多書。這是一個簡單的多對多關係,我理解的很好。但是,我會在哪裏存儲關於Alice的特定副本Moby Dick的信息?

我最終希望能夠做到以下幾點: - 找到誰擁有白鯨 副本所有用戶 - 改變對一本書的個人「實例」的信息:愛麗絲的白鯨的副本「貸款out「 - 更改/添加書籍信息(即每個人的副本):向Moby Dick添加發布者信息。

我看不出如何有效地解決這個問題。我可以有1本書的表格,1個用戶表格,然後n個用戶的表格,每個表格都包含有關他/她的收藏的信息。這似乎是,當我需要找到每一個與莫比迪克的副本時,它會很慢。任何的意見都將會有幫助。

回答

0

假設它是一個圖書館數據庫,我會從下面的設計開始。 表:

  1. 用戶(誰借到了書複印件)
  2. 書(關於這本書,書名,作者等基本信息......在這個層面上的信息是合乎邏輯的)
  3. 書副本(這一個存儲phsyical印刷書籍信息)
  4. 用戶借書(誰借的書的哪個副本)

此表結構允許,

  1. 一本書可以有很多書本副本,並且每一本都可以被識別。
  2. 一個用戶可以有很多書副本

爲了更好地理解這裏是一些僞SQL代碼。

「發現誰擁有白鯨的副本所有用戶」

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 

我覺得上面的查詢說明了表的結構,你可以添加像發佈日期預訂拷貝,或信息的屬性關於書籍作者,用戶賬戶貸款中的某些日期字段用於跟蹤使用期間

+0

如果我正確地理解了你,不能將#2和#3放在同一張表中嗎?我將使用Ruby/Rails/ActiveRecord,以便SQL代碼對我有幫助,但對於我來說不完全清晰。一位朋友建議您使用這種方法基本上是一樣的解決方案http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association – tir38

+0

books table是按照標題/名稱對書籍進行分組的地方,書籍副本是單獨的「實例」就像你說的一樣(一本書可能有很多副本)。這是你的設計,你會決定什麼是最適合你的。如果僅僅是爲了教育目的而開始,當你面臨由於你的設計而產生的問題/困難時,改變你的設計並迭代,練習是好的:) –