M:N表示sql中的关系

时间:2010-06-25 16:33:11

标签: sql

我正在试图找出在我的数据库中设置一些表的最佳方法。 我将在一个表中保存有关用户的数据,在另一个表中保存导航。 我会简化表格。

此刻我有两张桌子, 具有User_ID和User_Name的用户。 具有Nav_ID和Nav_Name的导航。

我在想的是每个用户都可以拥有“自己的”导航计数器。 所以基本上我要做的是Nav_ID计数器将从每个用户的1开始。

现在的工作方式是每个用户使用相同的导航表,Nav_ID从1开始计算每个人。

我认为我需要在中间创建一个1:n到n:1的表来连接用户和导航表。或者是否有另一种方式,听到有关代理人或某事的事情,但我不知道它是否是更好的方式。

2 个答案:

答案 0 :(得分:0)

对于每个用户有一个导航记录或一对多关系的一对一关系,其中每个用户都有多个导航记录(但每个导航记录只链接到一个用户):

您的导航表可能如下所示:

Nav_id, User_ID, Counter

我认为不需要第三张桌子。

Navigation.User_ID是User.User_ID的外键。

User
User_ID   Name
      1   Marcus
      2   David

Navigation
Nav_ID     User_ID     Count
     1           1         1
     2           2         1

但是,对于一对一的关系,如果导航只是一个字段,您甚至可以将其存储为用户中的字段:

User
User_ID    Name     Navigation_Count
      1    Marcus                  1
      2    David                   2

如果存在多对多关系,您只需要第三个表,其中您有用户和导航记录,但每个用户可能链接到多个导航记录,并且用户可能共享相同的导航记录。

答案 1 :(得分:0)

如果nav_id从每个用户的1开始,并且每个用户的导航记录与该用户相关,则您有一个弱表。用户与导航之间的关系为1:N。导航的主键是复合键:user_id,nav_id。您可能需要构建自定义代码以增加每个用户的nav_id。

导航上可以有一个列代理键,可以在所有用户中自动递增。这将是导航表中的主键。但是,我认为这不会有用。您仍然需要将自然主键实现为唯一约束。