我有两种不同类型的对象,例如事件和人。每个人都可以参加多个活动。我想要两个桌子
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
的外键。有什么办法吗?
答案 0 :(得分:1)
您需要具有用于多对多关系的桥接表。
因此,将PersonEvent
表添加到模型中
PersonEvent
- EventId [int (4),primary]
- PersonId [int (4),primary]
答案 1 :(得分:0)
这不是继续进行的正确方法。您需要用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);
bridge表包含一个自动递增的id,引用其他2个表的外键以及一个防止重复的唯一约束。
现在,假设您要列出参加给定事件的所有人员的姓名:
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';