0

私はデータベース設計について学び始めたばかりです。私の最初のプロジェクトでは、padrinoを使って簡単なブログを作成しましたが、今はもう少しやりがいのあるものが欲しいです。私はやや本好きなので、友達からいつも本を借りてほしいと言われます。だから当然、私はいつでもたくさんの本を浮かんでいます。

今、私は本を追跡できるアプリが欲しいです。つまり、すべての友達には「アカウント」があり、私にはたくさんの「本」があり、友達はいつでも本を借りることができます。しかし、異なるモデル間の関連付けをモデル化する方法が完全にはわかりません。

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

私がこのデザインで正しい方向に進んでいるかどうか、または私を助けることができるリソースを教えていただければ幸いです。どうすれば、「なくなった」本を効果的に管理して、再びレンタルできるようになりますか?

ありがとう

4

1 に答える 1

1

現在のデータモデルには1つの大きな欠陥があります。つまり、すべての本を同時に返す必要があります(実際にはそうではありませんがLoan、最初の本が戻ってきたとき、または最後の本が戻ったときは「returned_at」ですか?)。

との間にも少しの断絶がFriendありますAuthor-友人が著者になる(または著者が友人になる)とどうなりますか?それらはデータベースに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レコードよりも後のレコードがある本がわかります。


編集:

チェックアウト/インを「バッチ処理」するには、 Checkout/Checkinを次のバージョン に置き換えます。

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

テーブルを追加するだけではないことに注意してください_Book。トランザクションテーブルからもfk参照を削除する必要があります。そうしないと、厄介な重複エントリのリスクがあります。

于 2012-02-23T16:51:41.610 に答える