是否可以从同一个表中获得多个外键?

时间:2014-10-15 09:49:53

标签: mysql sql

首先,我只知道sql而不是专业人士,所以请耐心等待我

我的情况是默认条件是(例如)一个人只能有一个时间表而一个时间表只有一个人,所以我只需要创建一个person_id作为FK我的schedule table。 ( 1-1关系

但是,现在一个时间表可以有多个人,一个人可以有很多时间表(多对多关系)。是否有可能做到这一点?如何重新设计我的数据库?

3 个答案:

答案 0 :(得分:2)

听起来你有错误的方法;通常,子表具有对其父级的引用。这允许许多孩子共享同一个父母。

Parent(id, name)
Child(id, parent_id, name)

Parent(1, 'parent')
  - Child(1, 1 'child 1')
  - Child(2, 1 'child 2')
  - Child(3, 1 'child 3')

许多人在中间加入了一张表:

Person(id, name)

PersonSchedule(person_id, schedule_id)

Schedule(id, name)

-- you can now specify connections between any schedule and and person
Person(1, 'p1'), Person(2, 'p1')
Schedule(1, 's1'), Schedule(2, 's1')

PersonSchedule(1, 1)
PersonSchedule(1, 2)
PersonSchedule(2, 1)

此外,您还要在关联表中放置与关系相关的数据。比方说,一个人可能希望收到有关他们某些时间表的通知:

PersonSchedule(person_id, schedule_id, should_notify)

然后,您可以自由地说出哪些人被告知有关哪些时间表(或者回想其他方式,哪些时间表有人需要通知)。

答案 1 :(得分:2)

您描述的是1对N的关系。

一般来说,1位父母可以有N个孩子。 但是,每个孩子只能有一个父母(嗯......不是现实生活中的,但我想这就是你在你的例子中的含义)。

他们建模的方式是:

parent(ID, name)
child(ID, name, parent_ID)

child.ID是一个PK(它唯一地标识一个孩子)

parent.ID是PK(它唯一标识父级)

child.parent_ID是指向parent.ID的FK。 FK总是指向PK。

修改 从你的评论,你似乎想要一个N对M的关系。让我们再次使用父母和孩子,但就像在现实生活中一样:孩子确实有超过1个父母。 N-to-M关系使用一个链接两者的表来建模。

示例:

parent(ID, name) -- ID is PK
parent(1, 'parent1')
parent(2, 'parent2')
parent(3, 'parent3')

child(ID, name) -- ID is PK
child(10, 'child1')
child(11, 'child2')
child(12, 'child3')

-- who is parent of whom?

parent_child(parentID, childID) -- both parentID and childID are FKs
parent_child(1, 10)   -- parent1 is parent of child1
parent_child(2, 10)   -- parent2 is parent of child1
parent_child(2, 11)   -- parent2 is parent of child2

FK: parent_child.parentID -> parent.ID
FK: parent_child.childID -> child.ID

还有一点需要注意。从你这个问题不清楚你是否意识到以下几点:

虽然为这种关系设置PK和FK约束是一个非常好的主意,但它不是强制性的,不会影响问题的建模。

有一件事是使用如上所述的3个表对多对多场景进行建模。这将完美地工作。

另一件事是强制执行PK和FK约束。这将确保您不会意外地插入不一致的数据(例如,同一个人的两倍,或与不存在的父母的子父关系),以及帮助查询引擎提供更高的效率。

答案 2 :(得分:1)

在两个表之间引导多个引用并不是一个好主意。最好在关系之间加一个单独的表。 enter image description here

示例查询将按以下方式进行:

select * from Person
join PersonSchedule on PersonSchedule.PersonId= Person.Id
join Schedules on Schedules.Id = PersonSchedule.ScheduleId