2012-01-11 125 views
0

我在我的数据库中有一张表,用于存储表中的音乐家以及事件表。我想要做的是跟踪音乐家在什么事件中演奏什么。什么是最有效的方法来做到这一点?我是否应该将event_id放入音乐家表格中,并为音乐家演奏的每个事件创建新记录?我是否应该用event_idmusician_id创建单独的查找表,并在试图让特定活动中的音乐家参与时加入表格?问题是我目前有大约50位音乐家,他们每年可能会播放50个活动,这是大量冗余数据,还有一些人会参加更多活动,并且这个数字可能会增加到100位音乐家。有任何想法吗?数据库表设计

回答

2

我不会铺陈表给你,但基本结构是:

musicians - 关于事件的细节(例如50个记录 - 关于艺术家的细节
events(如50条记录。) )
musicians_events - 联合表列出了活动的艺术家演奏在

接合表将包括简单的2场:音乐家ID事件ID,均为外键返回到各自的父表。

随着您所陈述的数据大小,你有50分音乐家的记录,50条事件记录,并有可能2500音乐家事件记录,如果每一个音乐家在每一个活动中起。

+0

太好了,谢谢,那就是我需要知道的! – user1143767 2012-01-11 17:50:20

+0

另外,您可以在musicians_events(音乐人ID和事件ID)上创建一个UNIQUE多列索引。如果您将增加音乐家和/或活动的数量,这将确保未来有更好的表现! – mgm 2012-01-11 19:03:25

1

你需要单独的查找表(也称为结合表)来映射音乐家和事件之间的许多一对多的关系。

表需要三个字段UNIQUEID,MusicianID和事件ID。

0

您应该使用连接表。这是您列出的选项,您可以在event_idmusician_id之间选择一个表格。

如果你把正确的索引上的表格中它会表现良好。

0

我会创建一个表格与事件表的多对多关系的音乐家。

这意味着你将有一个名为的关系表假设包含MusiciantEvent两个主键(MusiciantID和EVENTID)

0

这听起来像一个典型的多对多一对多的关系,你应该有一个表音乐家,另一张表格,然后是第三张表格,存储它们之间的关系。该表将会有一个musicianId和一个eventId。

0

如果你可以在一个事件多的音乐家,然后模拟这种正确的方式是你提出的第二个方案 - 创建第二个表与musician_id和事项标识来联系他们。

至于数据量 - 50×50只有2500条记录,这是没有的MySQL。通过适当的索引,MySQL可以轻松处理表中数百万条记录。

0

这显然是一个M:N或许多一对多连接的情况:你需要三个表:

  • 一个musician表与musician_id

  • 一个eventevent_id

  • 具有musician_idevent_id的联结表(musician_events),其中两个字段均为主键。

从逻辑上说,你有多对多的关系。在物理上,您在musicianmusician_events之间存在一对多关系,并且eventmusician_events之间存在一对多关系。

这是因为一位音乐家可以参加很多活动,一个活动可以有很多音乐家。

musician    musician_events   event 
+-----------------+ +--------------------+  
| PK musician_id |--->| PK FK musician_id | +--------------+ 
|  name  | | PK FK event_id |<---| PK event_id | 
+-----------------+ +--------------------+ |  date  | 
               +--------------+ 
0

我会给事件的表像,所以这是只是一个示例

**tbl_Event** 
Event_ID 
Event_Name 
Event_Location 


**tbl_Musician** 
    musician_id 
    musician_firstName 
    musician_lastname 

***tbl_join*** 
    event_ID 
    musician_ID 

东西的性质。我不是专家,但任何你会看到很多重复的数据,你应该尽量避免它。