关于phpMyAdmin表关系和DB结构的问题

时间:2017-01-20 11:38:47

标签: mysql

我正在创建一个网站供青年组织用来组织活动,为即将举办的活动提供场所,并由会员签名。在我的数据库中,我有一个表格,可以分配给事件,就像这个网站,你可以标记你的问题。我有另一个表来存储有关事件的信息,例如标题,描述,要求,日期等。

我希望将这些数据库连接起来,这样当事件发生时,它们会被分配一个主标记和来自标记表中的无限量的二级标记。目前,我有一个链接表,其中包含事件ID字段,标记ID以及标记是否为主标记,但是我必须将字段设置为唯一以允许我创建关系我不能store输入多个事件或标签ID。

我的问题是,对于我构建上述功能的数据库,最好的方法是什么?此外,如果我正确地做的是正确的,那么如何在链接表中没有任何字段作为主键或唯一键的情况下链接表?

tblEvents enter image description here

tblTags enter image description here

1 个答案:

答案 0 :(得分:2)

因为你有什么被称为"多对多"关系(许多事件可以有许多标记)你需要一个处理赋值的中间表 - 这称为规范化。

在这种情况下,您需要3列:AssignmentID,EventID,TagID

将所有标记放在同一个数据库表中,但将每个标记标记为主要或次要标记,并在数据库外的代码中为每个事件处理1个主标记。

例如,您的代码表可能如下所示:

ETagID  ETagName  ETagColour  ETagPrimary  ETagDel
1       first     red         1            0
2       second    blue        0            0
3       third     green       0            0
4       forth     yellow      1            0
5       fifth     orange      0            0
6       sixth     white       0            0

和你的作业表:

AssignmentID  EventID  TagID
1             1        1     
2             1        2
3             1        5
4             2        4
5             3        4
6             3        1
7             4        4

由于sql之外的代码首先处理插入,现在可以使用连接查询表来为该事件提取事件+标记

SELECT ETagName, ETagColour FROM TagTable
JOIN AssignmentTable on AssignmentTable.TagID = TagTable.ETagID
JOIN EventTable on EventTable.EID = AssignmentTable.EventID
WHERE EventTable.EID = <some value> AND TagTable.ETagDel = 1 

这将选择未删除的特定事件的所有标记名称和颜色。

需要注意的重要事项是不要过度复杂化。如果您的主要和次要标签存储相同的信息,除了主要或次要,那么它无意义地将它们分成单独的表。像我提到的那样标记它们就足够了,减少了所需表的数量。

希望这能指出你向前迈进的正确方向

<强>更新

根据最近的评论,您可以在分配表中处理主标记的分配。创建与上面相同的表,但也包括主标志列

AssignmentID  EventID  TagID  PrimaryFlag
1             1        1      1  
2             1        2      0
3             1        5      0
4             2        4      1
5             3        4      1
6             3        1      0
7             4        4      1

然后在查询中,您还可以使用稍前修改过的版本选择标记的状态:

SELECT ETagName, ETagColour, AssignmentTable.PrimaryFlag FROM TagTable
JOIN AssignmentTable on AssignmentTable.TagID = TagTable.ETagID
JOIN EventTable on EventTable.EID = AssignmentTable.EventID
WHERE EventTable.EID = <some value> AND TagTable.ETagDel = 1 

如果你想确保主要标签出现在该列表的顶部,你也可以使用

ORDER BY AssignmentTable.PrimaryFlag