首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列中的外键数组

问列中的外键数组
EN

Stack Overflow用户
提问于 2019-01-02 22:10:24
回答 2查看 2.4K关注 0票数 1

我有两种不同类型的对象,比如event和person。每个人都可以参加多个活动。我想要两张桌子

代码语言:javascript
复制
event
- id      [int (4),primary]
- name    [varchar (30)]
- …

person
- id      [int (4),primary]
- name    [varchar (30)]
- mail    [varchar (60),unique]
- attends [Array of events.id]

因此,字段person.attends应该是长度为4的整数数组,我想告诉MySQL,这个数组中的每个值都是来自event.id的外键。有办法这样做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-02 22:39:49

你需要有一个桥接器表来处理多到多的关系。

因此,将PersonEvent表添加到模型中

代码语言:javascript
复制
PersonEvent
- EventId      [int (4),primary]
- PersonId     [int (4),primary]
票数 2
EN

Stack Overflow用户

发布于 2019-01-02 23:11:10

这不是正确的做法。您需要从database normalization的角度来思考:您在person和event之间有一种关系,其中每个人可能有许多事件,而每个事件可以有很多人。要建立这种关系的模型,您需要一个桥接表,例如:

代码语言:javascript
复制
CREATE TABLE attendance (
    id INT AUTO_INCREMENT,
    person_id INT NOT NULL,
    event_id INT NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY fk_person (person_id) REFERENCES person (id),
    FOREIGN KEY fk_event (event_id) REFERENCES event (id)
);

ALTER TABLE attendance
ADD CONSTRAINT attendance_pk UNIQUE (person_id, event_id);

桥表包含一个自动递增的id、引用其他两个表的外键,以及防止重复的唯一约束。

现在,假设您想列出所有参加某一活动的人的姓名:

代码语言:javascript
复制
SELECT p.name
FROM 
    event AS e
    INNER JOIN attendance AS a ON a.event_id = e.id
    INNER JOIN person AS p ON p.id = a.person_id
WHERE e.name = 'The Foo Event';
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54013842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档