2012-02-23 51 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之间也有一点断开 - 如果朋友成为作者(或作者成为朋友)会发生什么?他们最终会在你的数据库中两次,这是一个问题。

这是我怎么会开始你的图书馆数据库(这是它是什么,即使你只贷款给朋友)。我对数据映射器一无所知,所以这些都是表格设计本身。

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参考,否则您会冒一些令人讨厌的重复条目。

+0

谢谢你的回答。我完全忘记了你必须立即归还所有书籍的事实。但我仍然希望能够看到有人借了一笔贷款。如果添加另一个表“Book_Loan”作为FK'loanID'和'bookID'来连接它们,会有帮助吗? – nlw 2012-02-24 19:46:34

+0

@nlw - 发布必要的修改。 – 2012-02-24 21:29:55