Я не понимаю, как выразить связь между тремя отдельными таблицами - PullRequest
3 голосов
/ 07 февраля 2009

С учетом следующих таблиц в ActiveRecord:

  • Авторы
  • сайты
  • Статья

Я не знаю, как выразить, что автору платят разные суммы в зависимости от публикации, но авторы, работающие на одну и ту же публикацию, имеют разные ставки:

  • Джон публикует статью в Foo за 300 долларов
  • Джон публикует статью в баре за 350 долларов
  • Джон публикует статью в Базе за 400 долларов
  • Дик публикует статью в Foo за $ 250
  • Дик публикует статью в баре за 400 долларов

и т.д.

Какие отношения я пытаюсь описать?

На данный момент у меня есть таблица "ставок" с авторами _id, site _id и столбцами суммы. По публикации.id и author.id, я получаю стоимость статьи с

cost = Rate.find(:first, :conditions => ["author_id = ? and site_id = ?", author.id, site.id]).rate

Это работает, но я не уверен, что это лучший способ, и я не уверен, как сделать так, чтобы у Джона не было двух ставок на "Баз".

Я не думаю, что мне нужен код так сильно, как я хочу, чтобы кто-то сказал: "О, это ... отношения", чтобы я мог понять, для чего я Google.

Ответы [ 4 ]

5 голосов
/ 07 февраля 2009

Это имеет и принадлежит многим с богатой таблицей соединений.

class Author
  has_many :publications, :through => :rates
end

class Publication
  has_many :authors, :through => :rates
end

class Rate #rich join table
  belongs_to :author
  belongs_to :publication
end

И тогда вы можете упростить свой поиск следующим образом:

@author.rates.find_by_site_id(123)

Кроме того, вы получаете прямой доступ через объединительный стол

@author.publications
@publication.authors
1 голос
/ 08 февраля 2009

Когда три сущности связаны друг с другом, это называется троичным отношением.

Большинство отношений, с которыми мы имеем дело, являются двоичными, связывая две сущности друг с другом. Например, «Зачислены» отношения между студентами и курсами. Бинарные отношения далее подразделяются на многие ко многим, многие к одному и один к одному. Но ты знал это.

Троичные отношения можно отнести к категории «многие ко многим, многие ко многим к одному», многие-к-одному-одному и т. д.

Бинарные и троичные отношения могут быть далее обобщены на n-арные отношения.

Вот как я вижу описанный вами случай: Есть три объекта: автор, публикация и статья. В дополнение к этим трем объектам существует мера, а именно ставка. Я могу ошибаться по этому поводу.

Итак, я бы увидел три таблицы сущностей:

Авторы с PK AuthorID.
Публикации с PK PublicationID.
Статьи, с PK ArticleID.

Тогда будет таблица отношений с четырьмя столбцами:

AuthorID (FK), PublicationID (FK), AtricleID (FK), Курс, который является суммой в валюте.

PK этого (AuthorID, PublicationID, ArticleID)

Не то чтобы в этом дизайне нет таблицы тарифов. Это просто мера.

Обратите внимание, что в этом проекте несколько авторов могут сотрудничать в одной статье, и каждому из них предоставляется отдельная оценка за свою долю статьи. Это невозможно в некоторых других предлагаемых проектах.

Также возможно, что одна и та же статья может быть продана нескольким публикациям. Может быть желательно наложить ограничения на данные, если реальный мир налагает те же ограничения.

В любом случае, если вы хотите, чтобы поисковый запрос в Google, термин "троичные отношения".

1 голос
/ 07 февраля 2009

Это просто, но я не знаю, есть ли конкретное название для этих отношений.

Похоже, вам нужны три таблицы:

  1. Автор (информация об авторах)
  2. Сайт (информация о сайтах)
  3. Оценить Автор / Сайт (только информация о ставке)

В третьей таблице у вас будет как минимум:

  • Идентификатор автора (FK для автора и первичный ключ)
  • Идентификатор сайта (FK для сайта и первичный ключ)
  • Скорость

И таблица тарифов имеет два поля в качестве первичных ключей с уникальным ограничением. И любые объединения с участием автора и сайтов будут включать объединение из трех таблиц.

0 голосов
/ 07 февраля 2009

Я бы использовал третью таблицу:

author_site_mapper
------------------
id
author_id
site_id
rate

Я обычно слышал, что это называется "картографическим" отношением. Это означает отношение «многие ко многим» между двумя таблицами.

...