如何在处理多对多关系时创建条目?

时间:2017-11-29 03:56:28

标签: sql database

我正在努力了解我是否正确接近这种情况:

我有users我有events。用户可以属于许多事件,而事件可以有许多用户。如果我创建一个新的事件(id,名称,描述,日期),我还想存储所有可能参加此活动的用户(假设有5个用户)。

为此,我的交易必须包括以下两项:

  1. 将新活动(姓名,说明,日期)插入events

  2. 将5行Event_User(event_id,user_id)插入events_users

  3. 或者,还有另一种方法吗?

    为了它的价值,我使用nodeJS + knex查询构建器,并且我能够成功完成上面列出的事务。它添加了事件,并且还将可能要进入所述事件的n个用户添加到events_users表。但是,我试图了解这样的事情是如何完成的(不使用ORM)所以我想知道这种方法是否至少是正确的。

    谢谢!

1 个答案:

答案 0 :(得分:1)

我建议使用第三个表格 - 比如event_attendance - 来跟踪哪个users正在参加哪个events。您可以根据需要使用joins查询出勤情况。这是一种非常普遍的做法,熟悉它是很好的:

-- this query will tell you who is attending what
SELECT usr.username, evt.eventname, evt.eventdate
  FROM event_attendance att
 INNER JOIN events evt
    ON att.eventid=evt.eventid
 INNER JOIN users usr
    ON att.userid=usr.userid
 ORDER BY evt.eventdate ASC;

Here is a sql fiddle证明了这一点。我创建了非常简单的表:

CREATE TABLE users (userid int, username varchar);
CREATE TABLE events (eventid int, eventname varchar, eventdate date);
CREATE TABLE event_attendance (eventid int, userid int);

然后用数据填充它们:

-- create some users and events
INSERT INTO users VALUES (1, 'Jack');
INSERT INTO users VALUES (2, 'Jill');
INSERT INTO users VALUES (3, 'Anusha');
INSERT INTO users VALUES (4, 'Pierre');

INSERT INTO events VALUES (1, 'A Movie', '2017-11-30');
INSERT INTO events VALUES (2, 'Christmas Dinner', '2017-12-25');
INSERT INTO events VALUES (3, 'Skydiving trip', '2018-05-01');
INSERT INTO events VALUES (4, 'Big Reunion', '2018-06-01');

-- insert some attendance records
INSERT INTO event_attendance VALUES (1, 1);
INSERT INTO event_attendance VALUES (2, 1);
INSERT INTO event_attendance VALUES (2, 2);
INSERT INTO event_attendance VALUES (3, 2);
INSERT INTO event_attendance VALUES (3, 3);
INSERT INTO event_attendance VALUES (4, 1);
INSERT INTO event_attendance VALUES (4, 2);
INSERT INTO event_attendance VALUES (4, 3);
INSERT INTO event_attendance VALUES (4, 4);

根据这些数据,以下是您从上述查询中获得的出勤结果:

+----------+------------------+------------+
| username |    eventname     | eventdate  |
+----------+------------------+------------+
| Jack     | A Movie          | 2017-11-30 |
| Jack     | Christmas Dinner | 2017-12-25 |
| Jill     | Christmas Dinner | 2017-12-25 |
| Jill     | Skydiving trip   | 2018-05-01 |
| Anusha   | Skydiving trip   | 2018-05-01 |
| Jill     | Big Reunion      | 2018-06-01 |
| Pierre   | Big Reunion      | 2018-06-01 |
| Anusha   | Big Reunion      | 2018-06-01 |
| Jack     | Big Reunion      | 2018-06-01 |
+----------+------------------+------------+