PHP连接表关系(多对多),掌握概念

时间:2016-10-27 21:41:34

标签: sql foreign-keys many-to-many junction-table

所以我尝试过搜索,但还没有找到如何完全掌握这一点。

我正在重新组织我的数据库,因为我将用户ID作为逗号分隔值存储在一行中,以控制权限。对我而言,这似乎是一种更好,更快(硬件)的方式,但我现在正朝着这种“正确”的方式发展。

据我所知,你需要3张桌子。这就是我所拥有的。

Table 1. members -> ID | user_name
Table 2. teams -> ID | team_name
Table 3. team_members -> ID | team_fk | member_fk

我理解如何在另一列中存储数据并使用sql数据来显示它。我很困惑的是为什么我必须将列(关系)链接到其他表的ID。我可以在不使用关系的情况下获取数据。我对它甚至做了什么感到困惑。

此外,我希望有多个值来确定每个团队的权限。我会这样做:

Table 3. team_members -> ID | team_fk | member_fk | leader_fk | captain_fk

^为领队和队长设置0或1(真或假)。

或者我会为每个权限创建一个表(例如team_leaders,team_captains)吗?

感谢您的帮助!

赖安

2 个答案:

答案 0 :(得分:0)

似乎“领导者”,“队长和”正式成员“都是你团队中的角色。所以你可以创建表team_roles,或者只是将角色作为字符串分配给你的关系表,即

team_members -> ID | team_fk | member_fk | role 

关键是要保持数据库[规范化] https://en.wikipedia.org/wiki/Database_normalization。在大多数情况下,使用规范化数据库确实更容易。

答案 1 :(得分:0)

  

我感到困惑的是为什么我必须将列(关系)链接到其他表的ID。我可以在不使用关系的情况下获取数据。

您没有 将列声明为外键。这只是一个好主意。它有以下用途:

  1. 它告诉读者架构如何相互关联。如果您很好地命名列,这是多余的 - team_fk显然是对teams表的引用。
  2. 它启用数据库的自动完整性检查。如果您尝试创建包含不在相应表格中的team_membersteam_fk的{​​{1}}行,则会报告错误。请注意,在MySQL中,此检查仅由InnoDB引擎完成,而不是MyISAM。
  3. 自动为外键列创建索引,这有助于优化表之间的查询。
  4.   

    表3. team_members - > ID | team_fk | member_fk | leader_fk | captain_fk

    如果member_fkleader只是captain值,则它们不是外键。外键列包含对另一个表中的键的引用。所以我会称这些为true/falseis_leader

    但是,如果一个团队可以拥有多个队长和领导者,那么您应该只将这些值放在is_captain表中。如果只有一个,它们应该在team_members表中:

      

    团队 - > ID | team_name | leader_fk | captain_fk

    其中teamsleader_fkcaptain_fk表中的ID。这样可以确保您不会无意中将members分配给同一团队中的多个成员。