我有两种不同类型的对象,比如event和person。每个人都可以参加多个活动。我想要两张桌子
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的外键。有办法这样做吗?
发布于 2019-01-02 22:39:49
你需要有一个桥接器表来处理多到多的关系。
因此,将PersonEvent表添加到模型中
PersonEvent
- EventId [int (4),primary]
- PersonId [int (4),primary]发布于 2019-01-02 23:11:10
这不是正确的做法。您需要从database normalization的角度来思考:您在person和event之间有一种关系,其中每个人可能有许多事件,而每个事件可以有很多人。要建立这种关系的模型,您需要一个桥接表,例如:
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、引用其他两个表的外键,以及防止重复的唯一约束。
现在,假设您想列出所有参加某一活动的人的姓名:
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';https://stackoverflow.com/questions/54013842
复制相似问题