多对多对一对多

时间:2012-08-06 14:25:48

标签: mysql sql ruby-on-rails ruby activerecord

我需要设置用户权限才能修改其他用户个人资料。

我想要的是能够为每个用户设置可以处理的用户。 所以,假设我们有5个用户:A,B,C,D,E

我希望A能够处理B,C和D. 我希望B能够处理A,E,C。 等等...

这是一对多关系还是多对多关系?

我无法理解它,因为在我看来一对多,因为有一个用户有多个用户。但由于用户本身可以由另一个用户处理,因此我认为它可能是多对多的。

我应该问自己什么问题来确定正确的关系?

5 个答案:

答案 0 :(得分:5)

这是一个多对多的关系,因为一个帐户可以编辑多个,而且很多帐户都可以编辑一个帐户。

示例:

A can edit ABC  
B can edit AC 
C can edit BC

因此A可以由多个帐户编辑(或属于多个帐户),并且可以编辑多个帐户(或拥有多个帐户)

答案 1 :(得分:4)

让我们解决您的问题并了解如何识别这种关系。

当您编写将检查用户是否获得授权的代码时,您将拥有两个主要数据:执行编辑的用户和正在编辑的用户。那么,您的应用程序将要问的问题是“用户A可以编辑用户B吗?”

暂时忽略关系的语义,想想你如何查找这个问题的答案:

table can_edit:
  requestor_id | edited_id | permission
  =====================================
  User A       | User B    | YES
  User A       | User C    | YES
  User A       | User D    | YES
  User A       | User E    | NO
  User B       | User A    | YES
  User B       | User C    | YES
  User B       | User D    | NO
  etc...

使用此查找表,您可以确定谁有权编辑谁。但是,再看一下这个表格所描述的内容。由于您正在查找是/否问题的答案,因此您可以更简单地表达:

table can_edit:
  requestor_id | edited_id | permission
  =====================================
  User A       | User B    | YES
  User A       | User C    | YES
  User A       | User D    | YES
  User B       | User A    | YES
  User B       | User C    | YES
  etc...

此处我们删除了NO权限。现在我们可以问一下,“我们在can_edit中是否有与我们的权限检查匹配的条目?”如果我们执行查找并且该行存在,那么我们可以允许访问。

现在,由于permission列始终为YES,因此包含它并没有多大意义。所以现在我们有一个基本上是用户ID关系列表的表。

此时我们可以使用数据库图表绘制出关系的样子:

users:
  user_id  <-----+
  email          |       can_edit:
  pass_digest    +-------- requestor_id
               +========== edited_id
users:         |
  user_id <====+
  email
  pass_digest

如果我们查看rails association guide中的示例图表,我们可以看到我们的图表与has_many :throughhas_and_belongs_to_many都非常匹配。这些都描述了多对多关系。

就实施细节而言,您会注意到“用户A可以编辑用户B吗?”“用户B是用户A的朋友吗?”基本上是同一个问题,只是使用不同的关系术语。有了这些知识,您就会发现有关如何定义这种自引用has_many :through关系的卷,例如Ryan Bates的this excellent screencast

答案 2 :(得分:2)

如果您不确定,我建议您阅读有关rails关联的指南。有一些很好的例子和模式图片,说明了问题:

http://guides.rubyonrails.org/association_basics.html#the-has_and_belongs_to_many-association

答案 3 :(得分:0)

这是一个多对多关系,因为在您的示例A位于关系的两边。

答案 4 :(得分:0)

我猜是M2M关系,因为在表格多少?不止一个与 Hoy很多不止一个。

相关问题