简体   繁体   English

MySQL关系数据库设计

[英]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. 我有一个memberlist表(id,名称,数字),我只是将各列缩短。
  2. Next, I have an events table (id, eventName, description) 接下来,我有一个事件表(id,eventName,描述)

Now, 1. each member in the memberlist can join events as many as he wants. 现在,1.成员列表中的每个成员都可以根据需要加入任意数量的事件。 2. each events in the events table can have members without limits (okay, say 1k members, like that or whatever). 2.事件表中的每个事件都可以具有无限制的成员(好吧,说1k个成员,诸如此类)。

What I have now is an event table that has a column named: "joiners" which will contain the id of a certain joiner/member. 我现在所拥有的是一个事件表,该表具有名为“ joiners”的列,其中将包含某个特定的joiner / member的ID。 But I believe I'm wrong because how can a certain event handles many joiner's id? 但是我相信我错了,因为某个事件如何处理许多细木工的ID?

You'd want a third table called events_memberlist : 您需要第三个表,名为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: 您需要第三个表来娱乐,我们将其称为EventMemberTable,col为:

event id | member

it links the appropiat member to the appropiat event. 它将appropiat成员链接到appropiat事件。 Keeping your other tables clear of redundant data. 保持其他表中没有冗余数据。

I would rename memberlist into members to make your table naming more consistent. 我会重新命名memberlist进入members ,使您的表命名更加一致。 Or events into eventlist . eventseventlist 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. 我假设你的memebersevents你已经有id被设置成主键字段。

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. PS也许下次发布一些语法。

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. 否则,您可能最终会产生大量重复。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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