1

我正在建立一个教科书数据库。ABook看起来像这样:

  • ID
  • 标题
  • 伊斯本
  • 作者
  • 科目
  • 班级
  • 大学
  • 教授

虽然一本书(显然)只有一个标题或 ISBN - 我希望作者、学科、大学和教授成为一种“标签”。一本书可以由多个作者编写,用于多个教授教授的多个课程中的多个科目。所以我想为每一个建立一个多对多的关系。例如,一个Author可能看起来像:

作者

  • ID
  • 姓名
  • 图书

书属于作者对我来说不一定有意义,反之亦然(尽管我可能是错的。)但我也不知道创建book_author_associations表格、book_jubjects_associations模型、book_classes_associations模型等。

像这样创建多个多对多的最佳方法是什么?

4

2 回答 2

3

没有测试,但理论上应该可以工作:

Book
  has_many :book_associations
  has_many :associations, through: :book_associations

BookAssociation
  belongs_to :book
  belongs_to :association, polymorphic: true
  validates :book_id, presence: true
  validates :association_id, presence: true
  validates :association_type, presence: true

Author
  has_many :book_associations, as: :association
  has_many :books, through: :book_associations

Subject
  has_many :book_associations, as: :association
  has_many :books, through: :book_associations
于 2013-09-18T15:11:32.967 回答
1

在这种情况下,连接表是不可避免的。

您应该继续为课程、主题、作者等创建单独的表,因为它们具有非常不同的属性。您应该通过连接表将它们与书籍相关联,这些连接表在大多数情况下都有自己的属性。

例如,一本书的撰稿人可以是作者,或者他们可以是编辑、摄影师、翻译或任何数量的其他角色,而该角色将是书籍和作者之间关联的一个属性(最好称他们为贡献者)。

有关此类事情的更多信息,您可以查看 EDItEUR 的 Onix 代码列表,了解有关书籍元数据结构的想法。http://www.editeur.org/14/Code-Lists/

于 2013-09-18T15:42:01.880 回答