建模可以与多个表建立关系的表

时间:2012-01-24 17:52:09

标签: mysql database database-design

我有一个名为'notes'的表,在这个表上我需要跟踪谁做了那个音符,但问题是该音符的创建者可以是存储在三个可能表中的一个中的用户:

  

用户   引线   管理者

我只是在'notes'上创建三个字段来表示三种可能的关系:note.user,note.lead,note.manager

使用这种方法,我会被迫在请求收集创建者信息的注释时创建三个表连接,我不认为这是要走的路,所以我想听听你的想法或意见以及什么这将是最好的方法。

4 个答案:

答案 0 :(得分:1)

就我个人而言,这在设计问题的完全不同的部分有点像设计问题:管理员不是用户吗?领导是否携带人员信息?

使用任何方法在一列和另外三列之间创建关系,您将需要三个连接来进行选择。如果您无法解决根本问题,我建议您使用

note_type ENUM('users','leads','managers')

作为附加字段和

SELECT
  ...
  IFNULL(users.name(IFNULL(managers.name,leads.name))) AS name
  ..
FROM notes
LEFT JOIN users ON notes.note_type='users' AND users.id=notes.note_source
LEFT JOIN managers ON notes.note_type='managers' AND managers.id=notes.note_source
LEFT JOIN leads ON notes.note_type='leads' AND leads.id=notes.note_source
...

用于查询

答案 1 :(得分:0)

我认为您需要抽象出用户ID的概念,以便它不依赖于他们的角色。然后可以通过用户ID指定注释的作者。

可以为用户分配角色,也可以分配多个角色。

答案 2 :(得分:0)

构建此方法的正确方法是从用户,潜在客户和经理中提取所有常见数据。将此数据统一到“联系人”表中。然后,如果你想得到给定经理的所有笔记:

managers->contacts->notes

领导:

leads->contacts->notes

请注意您的原始帖子:“问题是该笔记的创建者可以是存储在三个可能表格之一中的用户”

从句子的结构来看,你甚至承认所有这些实体都有一些共同之处;他们都是用户。为什么不让DB反映这个?

答案 3 :(得分:0)

您必须为已有的三个表建模父表。定义一个通常描述用户,潜在客户和经理表的表。像“人”之类的东西。因此,您拥有三个表中的所有ID以及Person表上的任何公共属性。当你必须定义关系时,你将外来id“Person_ID”放在note表上。当您对用户,潜在客户和经理表进行建模时,您还将主键作为外键放入Person表中。 所以你会有这样的事情: 表用户: 用户(   person_id主键   ...(用户的属性)   foreign key person_id引用Person.person_id )

我描述的这个模型对于你必须使用父母和孩子进行建模的任何关系模型都是通用的