简体   繁体   中英

MySQL relationship database design

I have seen a question on this forum that I can relate with, but I can't apply the answers to my question.

Here it goes:

  1. I have a memberlist table (id, name, number) I'll just make the columns short.
  2. Next, I have an events table (id, eventName, description)

Now, 1. each member in the memberlist can join events as many as he wants. 2. each events in the events table can have members without limits (okay, say 1k members, like that or whatever).

What I have now is an event table that has a column named: "joiners" which will contain the id of a certain joiner/member. But I believe I'm wrong because how can a certain event handles many joiner's id?

You'd want a third table called events_memberlist :

events_memberlist - memberlistId - eventId

This would allow you to maintain a many-to-many relationship between the two tables.

you need a third table for fun we will call it EventMemberTable, col's:

event id | member

it links the appropiat member to the appropiat event. Keeping your other tables clear of redundant data.

I would rename memberlist into members to make your table naming more consistent. Or events into eventlist . Which ever you like more.

Then you want to define a many to many relation between members and events. This is done through an intermediate table which will reference both:

create table eventmembers (
    id int unsigned not null primary_key auto_increment,
    member_id int unsigned not null references members(id),
    event_id int unsigned not null references events(id)
)

I'm assuming that on your memebers and events you already have id fields which are set to be primary keys.

If you want to get all events attended by a specific user you can then do

select events.*
from events
left join eventmembers
  on events.id = eventmembers.event_id
where
    member_id = ?

and get all the members in an event:

select members.*
from members
left join eventmembers
  on members.id = eventmembers.member_id
where
    event_id = ?

You can achieve this by having a middle table (between members, and events). Middle tables are necessary in situations where a 'many-to-many' relationship between two tables is required.

In the middle table, you will include the primary keys of both tables as foreign keys, on the same row, when a member has joined an event. The foreign keys effectively create the relationship between one member, and one event. The table however, can have thousands of these entries.

I hope that helps. PS Maybe post some syntax next time.

Cheers

When you use a middle table as already mentioned like:

CREATE TABLE event_members (
    member_id INT UNSIGNED NOT NULL REFERENCES members(id),
    event_id INT UNSIGNED NOT NULL REFERENCES events(id)
)

you should also set up a unique index to prevent multiple entries for the same member/event combination like

ALTER TABLE event_members ADD UNIQUE INDEX uniq_event_members_idx (member_id, event_id);

Otherwise you might end up with loads of duplicates.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM