在数据库中表示多对多关系的最佳方式是什么?

时间:2009-10-22 22:41:31

标签: mysql database-design many-to-many

如果我有多个用户和多个页面,并且每个用户都可以管理任意数量的页面,并且每个页面都可以由任意数量的管理员管理,我怎样才能将所有这些权限存储在数据库?

例如,我可以在users表中有一个字段,它只是一个以逗号分隔的页面ID列表,或者是每个页面的类似字段(由...等管理)。但这需要我在数据库出来后处理它。

我可以为每个用户提供他们自己的表格,使用key =>值类型的布局,其中我有user => someuser,name => some guy,permissions => whatever,page_id =&gt ; 4,page_id => 8,page_id => 12等。但这看起来很混乱,需要额外的权限才能为mysql用户提供。

假设页面数量相对较少(它会是),我可以在users表中放置一个'flags'字段,一个32位的INT(这里不会有超过32个页面')实现)。但这只会允许一种开/关的特权。

我还考虑过拥有一个用户表,然后每个用户入口指向该用户的权限表,每个页面都有一行,对该用户具有适当的权限 - 比其他用户更干净“我列出的每个用户表“解决方案,但同样需要mysql帐户的额外权限。

还有其他想法吗?根据您的经验,最终解决这个问题的方法是什么?

3 个答案:

答案 0 :(得分:18)

很多< - >许多关系通常用中间表建模。在你的情况下,你会有这些表:

User        UserPage       Page
------      -----------    -------
UserID      UserID         PageID
...         PageID         ...

中间表(此处为UserPage)用于存储特定于该组ID的信息(在本例中为您的权限)。

答案 1 :(得分:2)

规范的方法是有一个中间表,只有两个字段:每个连接表的主键。

答案 2 :(得分:1)

您需要的是映射表。

USER -----< USER_PERMISSIONS> ----- PAGES

新表的主键是由user_id和page_id组成的复合键

这将为您提供最大的灵活性,并允许添加新页面而无需更改架构。