простой дизайн базы данных аренды с datamapper - PullRequest
0 голосов
/ 23 февраля 2012

Я только начинаю изучать дизайн базы данных. Для моего первого проекта я сделал простой блог с падрино, и теперь я хочу что-то более сложное для меня. Так как я в какой-то степени чокнутый, мои друзья всегда просят меня одолжить им книги. Поэтому, естественно, в любой момент времени у меня много книг.

Теперь я хотел бы иметь приложение, которое позволяет мне отслеживать книги, а именно: у каждого друга есть »Учетная запись«, у меня много »Книг«, и мои друзья могут брать книги в аренду на любой определенный период времени. Но я не совсем уверен, как моделировать связи между различными моделями.

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 Ответ

1 голос
/ 23 февраля 2012

Ваша текущая модель данных будет иметь один существенный недостаток - то есть книги должны быть возвращены в одно и то же время (ну, не совсем, но это будет Loan return_at ', когда возвращается первая книга, или в последний?).

Существует также некоторая разница между Friend и Author - что произойдет, если друг станет автором (или автор станет другом)? Они попадут в вашу базу данных дважды, что является проблемой.

Вот как я могу запустить вашу библиотечную базу данных (что есть, даже если вы одалживаете только друзьям). Я ничего не знаю о 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 из таблиц транзакций, иначе вы рискуете получить несколько неприятных дублирующих записей.

...