Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 关于phpMyAdmin表关系和数据库结构的问题_Mysql - Fatal编程技术网

Mysql 关于phpMyAdmin表关系和数据库结构的问题

Mysql 关于phpMyAdmin表关系和数据库结构的问题,mysql,Mysql,我正在创建一个网站,供一个青年组织用于组织活动,为即将举行的活动提供一个地方,供会员列出和注册。在我的数据库中,我有一个满表的标签,可以分配给事件,很像这个网站,你可以标记你的问题。我有另一个表来存储有关事件的信息,例如标题、描述、要求、日期等 我希望将这些数据库连接起来,以便在创建事件时,从标记表中为它们分配一个主标记和无限多个辅助标记。目前,我有一个链接表,其中有一个用于事件ID、标记ID以及标记是否为主标记的字段,但是由于我必须将字段设置为唯一,以允许我创建一个无法存储的关系,因此输入多个

我正在创建一个网站,供一个青年组织用于组织活动,为即将举行的活动提供一个地方,供会员列出和注册。在我的数据库中,我有一个满表的标签,可以分配给事件,很像这个网站,你可以标记你的问题。我有另一个表来存储有关事件的信息,例如标题、描述、要求、日期等

我希望将这些数据库连接起来,以便在创建事件时,从标记表中为它们分配一个主标记和无限多个辅助标记。目前,我有一个链接表,其中有一个用于事件ID、标记ID以及标记是否为主标记的字段,但是由于我必须将字段设置为唯一,以允许我创建一个无法存储的关系,因此输入多个事件或标记ID

我的问题是,为上述功能构建数据库的最佳方式是什么?此外,如果我所做的正确无误,那么如何在链接表中的字段都不是主键或唯一键的情况下链接表

t等级

tblTags

由于您有所谓的“多对多”关系(许多事件可以有许多标记),您需要一个处理赋值的中间表-这称为规范化

在本例中,需要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 
然后,在查询中,您还可以使用之前编写的略为修改的版本来选择标记的状态:

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 

由于您有所谓的“多对多”关系(许多事件可以有许多标记),您需要一个处理赋值的中间表-这称为规范化

在本例中,需要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 
然后,在查询中,您还可以使用之前编写的略为修改的版本来选择标记的状态:

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 

您需要一个用于赋值的中间表,它通常采用事件id和标记id。表将有3列-tableid、eventid、,tagid@Takarii是的,这就是我假设的情况,但是没有tableid字段,而是一个字段来说明标记是被分配为主标记还是辅助标记。但是,请您解释一下第二点,关于我如何将字段分配为外键,而不使其唯一或主要?将所有标记放在同一个表中,然后将它们标记为主要或次要标记。在代码中,在外部处理每个事件1个主标记的限制database@Takarii标记可以是主标记或辅助标记。例如,使用这个网站的场景,这个问题主要是SQL,所以我会选择SQL作为主要标记,但是它也可能与PHP相关,因此它将是次要标记。尽管在另一个问题上,它可能更多地是关于PHP的,因此这将是主要的,SQL将是次要的。因此,主定义或次定义需要与标记表分开存储,因此标记的每个分配都被定义为主定义或次定义,而不是标记本身。这怎么可能?对,我明白你的意思。在这种情况下,在分配表中执行此操作,因为您正在“分配”该标记作为主要-请参阅我的更新答案您需要一个中间表来分配,该表通常包含事件id和标记id。表将有3列-tableid、eventid、,tagid@Takarii是的,这就是我假设的情况,但是没有tableid字段,而是一个字段来说明标记是被分配为主标记还是辅助标记。但是,请您解释一下第二点,关于我如何将字段分配为外键,而不使其唯一或主要?将所有标记放在同一个表中,然后将它们标记为主要或次要标记。在代码中,在外部处理每个事件1个主标记的限制database@Takarii标记可以是主标记或辅助标记。例如,使用这个网站的场景,这个问题主要是SQL,所以我会选择SQL作为主要标记,但是它也可能与PHP相关,因此它将是次要标记。尽管在另一个问题上,它可能更多地是关于PHP的,因此这将是主要的,SQL将是次要的。因此,主定义或次定义需要与标记表分开存储,因此标记的每个分配都被定义为主定义或次定义,而不是标记本身。这怎么可能?对,我明白你的意思。在这种情况下,在将该标记“分配”为主要标记时在分配表中执行此操作-请参阅我的更新答案我已尝试修改SQL以收集有关事件的所有信息及其主要标记的信息,如选择EID、ETitle、EDesc、EReq、EStartD、EEndD、ESUDeadline、EMaleS、EMaleS、EFemaleTS、,tblTags.etagcolor从tblEvents加入tblTagLink上的tblTagLink.ETagID=tblTags.ET