0

我有一本书模型和笔记模型。每本书都可以有很多笔记。具有单个属性的资源。签署一些有味道?

# note.rb 
id | book_id | content | page_number | author_id | 

我想运行一个查询很多像

  1. 获取所有的笔记某本书
  2. 显示某本书的所有注意页面的43页

这些类型的查询似乎有利于制作单独的known_pages模型,以便一本书可以有许多known_pages,并且每个noted_pa​​ge可以有多个notes。这很好,但我的noted_pa​​ges表将实际上只有一个id列和一个page_number列,这些列并不适合我。

是否有更标准的方式来实现这种设置或我的思维好吗?

回答

1

一个known_page表会将笔记与页面关联起来,但是您是否需要一个页表?

如果你需要一个页表,那么是的,担心注意< - >页面多对多的关系,并创建一个链接表。如果您不需要将book_pages存储为表格的行,则不要。

您的设计: ID | book_id |内容| page_number | author_id |

会给你你想要的答案通过查询这样的:

  1. 获取所有的笔记某本书

    选择的43页* 从注 其中book_id = 123和PAGE_NUMBER = 43;

  2. 显示某本书

    选择PAGE_NUMBER的所有网页指出,从张数(ID) 其中book_id = 123 组由PAGE_NUMBER;

如果性能是一个问题,然后把一个索引放在页码上。你也可以将(id,book_id,page_number)变成一个组合键,所以你的数据将被存储(注3,book 123,page 43)。

+0

在这个问题上的大部分答案帮助我解决了我的问题,但我接受这个问题,因为它最能描述我最终做了什么,而且我对解决方案感到满意。 – 2011-04-14 07:00:28

0

如果你想要多对多的关系,就像书中可以有很多笔记一样,并且笔记可以有很多书,那么你必须有一个像你所说的连接表。

它看起来像:

noted_page 
-------------- 
id book_id note_id 

这只是一般的做法,只要你有一个多一对多的关系,您必须有一个连接表。

(一些框架/ ORM的不要求你有一个id列,但据我所知,轨道/ ActiveRecord的确实需要它。)

+0

这不是一个真正的多对多的关系,我要去。每张纸条只会与一本书相关联。我的问题是,如果定义额外的known_pages模型是值得的,或者我可以使用示波器或其他技术来取而代之吗? – 2011-04-12 14:27:08

0

没有设计是坏的......它只是需要是有道理的。

我看到不同的解决方案:

  1. 一个BOOK {标题,作者,EDITED_DATE ...}有许多PAGE {}内容的has_many NOTES {} note_content
  2. 一个BOOK {内容,标题,作者,edited_date ...} has_many NOTES {note_content,page_number}

这取决于你如何工作机智这本书。您是否计划通过网页保存书籍的内容?如果没有,那么你能找到页面,因此注释?

关于你的问题:

  • 一个属性的模式不在于它“闻香”的标志。如果它是正当的,你甚至可以有一对一的关系。
  • 没有“标准”的实施方式。就像我说的,这取决于你如何工作,你如何规划你的用户使用它(UI-wised),你将如何存储等......
  • 你肯定不会需要一个多对多的,很多在你的情况下...轨道提供足够的工具从模型获取其关联,W/W/O条件等...

让我知道它是否有帮助。

+0

由于这种无法解释的downvote,我正在放弃互联网。 – 2011-04-13 06:00:23

+0

我没有倒下,但我猜想有人反对“没有设计是坏的,它只是需要证明。”有很多不好的设计 - 真正可怜的,死脑筋的设计 - 在野外。可能数以百万计。 – 2011-04-13 21:31:35

+0

不知道为什么你被downvoted。我发现你的答案很有帮助。 – 2011-04-14 07:01:04

0

这两个可以简单AREL查询,没有范围需要

后者是纸币收藏存在的一个简单的检查:

@book.notes.empty? #if there are no notes, it'll return true and vice versa 

要获得一书札记某些页面:

@book.notes.where(["page_number = ?", page_number]) #where page_number is a variable, possibly a parameter 

但是,我认为您需要考虑如何为数据建模。马塞尔有一个好点。

0

你的设计很好。不要过度正常化。您可能只想在笔记表上放置book_id, page_number索引,以便高效地进行查找。

相关问题