我正在努力了解我是否正确接近这种情况:
我有users
我有events
。用户可以属于许多事件,而事件可以有许多用户。如果我创建一个新的事件(id,名称,描述,日期),我还想存储所有可能参加此活动的用户(假设有5个用户)。
为此,我的交易必须包括以下两项:
将新活动(姓名,说明,日期)插入events
将5行Event_User(event_id,user_id)插入events_users
或者,还有另一种方法吗?
为了它的价值,我使用nodeJS + knex查询构建器,并且我能够成功完成上面列出的事务。它添加了事件,并且还将可能要进入所述事件的n个用户添加到events_users
表。但是,我试图了解这样的事情是如何完成的(不使用ORM)所以我想知道这种方法是否至少是正确的。
谢谢!
答案 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 |
+----------+------------------+------------+