2012-02-23 16 views
0

データベース設計について学び始めました。私の最初のプロジェクトでは、私はpadrinoで簡単なブログを作ったので、今はもっと挑戦したいことがあります。 私は多少の本のナッツですから、私の友人はいつも私にそれらの本を借りてください。自然に私はいつでも周りにたくさんの本を浮かべています。datamapperを使用した簡単なレンタルデータベース設計

今私は書籍を追跡できるアプリを持っていたいと思っています。すべての友人は»アカウント«を持っています。私は多くの書籍»を持っていて、友達は任意の期間。 しかし、さまざまなモデル間の関連付けをどのようにモデル化するのかは完全にはわかりません。

class Friend 
    include DataMapper::Resource 

    property :id, Serial 
    property :name, String 
    property :surname, String 

    has n, :loans 
end 

class Loan 
    include DataMapper::Resource 

    property :id, Serial 
    property :started_at, Date 
    property :returned_at, Date 

    belongs_to :friend 
    has n, :books 
end 

class Author 
    include DataMapper::Resource 

    property :id, Serial 
    property :name, String 
    property :surname, Integer 

    has n, :books 
end 

class Book 
    include DataMapper::Resource 

    property :id, Serial 
    property :title, String 
    property :year, Integer 
    property :returned, Boolean 

    belongs_to :author 
    belongs_to :loan 
end 

私はこのデザインで正しい軌道にいるかどうかを教えてもらえますか、私に役立つリソースを教えてください。 書籍を「無くなった」状態で効果的に管理し、次に貸し出しに利用できるようにするにはどうすればよいですか?

おかげ

答えて

1

あなたの現在のデータモデルは、一つの大きな欠陥を持っているとしている - つまり、書籍はすべて(うまく、本当に同時に戻ったが、最初の本が来るときLoan「returned_at」でなければなりません後ろに、または最後に?)。

FriendAuthorの間に少しの切断があります。友だちが著者になる(または作成者が友人になる)場合どうなりますか?彼らはあなたのデータベースで2回終わるでしょう、これは問題です。

あなたのライブラリデータベースを開始する方法は次のとおりです(これは、あなたが友人にのみ貸与していても同じです)。私はdatamapperについて何も知らないので、これらはテーブルデザインそのものです。

Person 
========== 
id -- autoincrement 
fullname -- varchar(128) - names are tricky, keep it simple here 
nickname -- varchar(15), nullable - optional 

Book 
========= 
id -- autoincrement 
isbn -- char(16) - check length, though 
title -- varchar(128) - this only works with single-language libraries 
yearPublished -- integer 

Book_Author 
============= 
bookId -- fk reference to book.id 
authorId -- fk reference to person.id 

Subject 
========== 
id -- autoincrement 
subject -- varchar(16) 
description -- varchar(256) 

Book_Subject 
=============== 
bookId -- fk reference to book.id 
subjectId -- fk reference to subject.id 

Checkout 
=============== 
id -- autoincrement 
occuredAt -- timestamp, UTC if possible (or capture timezone) 
bookId -- fk reference to book.id 
personId -- fk reference to person.id 

Checkin 
============== 
id -- autoincrement 
occuredAt -- timestamp, UTC if possible (or capture timezone) 
bookId -- fk reference to book.id 

あなたは、あなたが現在の本はCheckin記録後にすべてのCheckoutの記録よりも持っていることで、手に持っているものの本伝えることができます。


EDIT:

'バッチ' チェックアウト/インするには、次のバージョンでCheckout/Checkinを置き換える:あなただけ_Bookテーブルを追加したくない

Checkout 
=============== 
id -- autoincrement 
occuredAt -- timestamp, UTC if possible (or capture timezone) 
personId -- fk reference to person.id 

Checkin 
============ 
id -- autoincrement 
occuredAt -- timestamp, UTC if possible (or capture timezone) 

Checkout_Book 
================== 
checkoutId -- fk reference to Checkout.id 
bookId -- fk reference to Book.id 

Checkin_Book 
================== 
checkinId -- fk reference to Checkin.id 
bookId -- fk reference to Book.id 

注意 - トランザクションテーブルからfk参照を削除する必要があります。そうしないと重大な重複エントリが発生する危険があります。

+0

ありがとうございました。私はあなたが一度にすべての本を返さなければならないという事実を完全に忘れていました。しかし、私はまだ誰かが1つのローンで得た本を見ることができるのが好きです。 'loanID'と' bookID'をFKとし、 'book_Loan'テーブルを追加すると、両方のテーブルを結ぶことができますか? – nlw

+0

@nlw - 必要な変更を投稿しました。 –

関連する問題