1

ユーザーのテーブルを作成し、名前を付けてUSERS、各ユーザーがより多くのユーザーを参照できるようにしたいと考えています。これは、ユーザーでもある友達が何人かいて、ユーザーでもある友達がもっといるユーザーなどと考えることができます。

このテーブルとそれ自体の間に多対多の関係を使用する必要がありますか、それともジャンクション テーブルを使用する必要がありますか?

たとえば、テーブル (ジャンクション テーブルの表記なし) は次のようになります。

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

4

3 に答える 3

4

各行に 2 人のユーザー間の「関係」の詳細が含まれるジャンクション テーブルを使用する必要があります。

|UserID1|UserID2|
|      1|      2|
|      2|      3|
于 2012-09-06T12:25:57.303 に答える
1

ユーザー ID が保存される別のテーブル n:n が必要です。たとえば、あなたの友人ごとに、yourId と onefriendsId を含むレコードが存在します。

于 2012-09-06T12:32:40.450 に答える
0

すでに述べたように、「User」という名前のオブジェクトと「Person」という名前のオブジェクトがあります。これら2つには、「すべての「人」は間違いなく「ユーザー」である」というファクトリー関係がありますが、「すべての「ユーザー」は「人」ではない可能性があります」、つまり「すべての「ユーザー」は「人」でもある」という意味です。 'PersonOrder'をジャンクションテーブルとして使用して'Person'sを関連付けました。他の制約は、ジャンクションテーブルとして"各子'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
于 2012-09-06T12:42:04.430 に答える