2012-09-06 60 views
1

我想創建一個用戶表,我們把它命名爲USERS,我希望每個 用戶都能夠指向更多的用戶。您可以將其視爲擁有一些也是用戶的朋友的用戶,並擁有更多的朋友,這些用戶也是用戶等。sql與同一個表的多對多關係

我是否需要使用該表與其自身之間的多對多關係或使用聯結表?

例如表(不結表的符號)可能看起來像:

| USER_ID(PK) | NAME | AGE | _ID(FK) |

回答

3

應該使用結表,其中每一行包含的兩個用戶之間的「關係」的詳細信息。

|UserID1|UserID2| 
|  1|  2| 
|  2|  3| 
1

你需要另一個表N:N,其中usersID的保存,例如會有對你的每個朋友,包括yourId的記錄和onefriendsId

0

正如你已經提到的,你有一個對象命名爲'用戶'和另一個名爲'人'。這兩個人有一個Factory關係,這意味着「Every'Person'肯定是'User'',但'Every'User'可能不是'Person'」,也意味着「Every'User'也是'Person'可以通過使用'PersonOrder'作爲聯結表來關聯'Person',另一個約束是作爲聯結表「每個孩子'Person'必須是唯一的」。

我知道這是你真正需要實現的,但它是一個規範化的結構。如果我是你,我會以這種方式實施。

鏈接圖:http://sdrv.ms/ROVtJc

乾杯

USE [temp] 
GO 
/****** Object: Table [dbo].[User] Script Date: 09/06/2012 17:11:23 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[User](
    [Id] [bigint] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](50) NOT NULL, 
    [Age] [tinyint] NOT NULL, 
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: Table [dbo].[Person] Script Date: 09/06/2012 17:11:23 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Person](
    [Id] [bigint] NOT NULL, 
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: Table [dbo].[PersonOrder] Script Date: 09/06/2012 17:11:23 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[PersonOrder](
    [Id] [bigint] IDENTITY(1,1) NOT NULL, 
    [Person_Parent_Id] [bigint] NOT NULL, 
    [Person_Child_Id] [bigint] NOT NULL, 
CONSTRAINT [PK_PersonOrder] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], 
CONSTRAINT [IX_FriendOrder_Child_Unique] UNIQUE NONCLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: ForeignKey [FK_Person_User] Script Date: 09/06/2012 17:11:23 ******/ 
ALTER TABLE [dbo].[Person] WITH CHECK ADD CONSTRAINT [FK_Person_User] FOREIGN KEY([Id]) 
REFERENCES [dbo].[User] ([Id]) 
GO 
ALTER TABLE [dbo].[Person] CHECK CONSTRAINT [FK_Person_User] 
GO 
/****** Object: ForeignKey [FK_PersonOrder_Person_Child] Script Date: 09/06/2012 17:11:23 ******/ 
ALTER TABLE [dbo].[PersonOrder] WITH CHECK ADD CONSTRAINT [FK_PersonOrder_Person_Child] FOREIGN KEY([Person_Parent_Id]) 
REFERENCES [dbo].[Person] ([Id]) 
GO 
ALTER TABLE [dbo].[PersonOrder] CHECK CONSTRAINT [FK_PersonOrder_Person_Child] 
GO 
/****** Object: ForeignKey [FK_PersonOrder_Person_Parent] Script Date: 09/06/2012 17:11:23 ******/ 
ALTER TABLE [dbo].[PersonOrder] WITH CHECK ADD CONSTRAINT [FK_PersonOrder_Person_Parent] FOREIGN KEY([Person_Child_Id]) 
REFERENCES [dbo].[Person] ([Id]) 
GO 
ALTER TABLE [dbo].[PersonOrder] CHECK CONSTRAINT [FK_PersonOrder_Person_Parent] 
GO