-1

私はstackoverflowでこの質問についてたくさん検索します。私と同じ問題がありますが、私の問題を解決しませんでした。ユーザーを含むテーブルを作成しました。列は次のようなものです。

uid 
username
name
family
....

今、私はブラックリストに載っている人のユーザーIDを保存するブラックリストを作成する必要があります。各人が多くのブラックリストに載っている人を持つことができるので、このテーブルを作成する方法がわかりません。

uid = 1
blacklistid = 3

uid = 1
blacklist equal 4

この場合、私はそれが間違っていると思う主キーを持っていません.auto incerementモードで主キーを挿入すると、非常に大きなintがあり、なぜこの主キーが必要なのですか?どのような理由で?私は誰かに尋ねました彼は多分あなたのデザインに問題があると私に言った

次に、このケースを設計する方法を知る必要がありますか?

4

3 に答える 3

2

ブラックリストテーブルの主キーは、ユーザーIDとブラックリストIDの組み合わせです。

User
  id
  name
  ...

Blacklist
  user_id
  target_id

user_idとtarget_idの組み合わせは一意である必要があります。

自動インクリメントIDフィールドは必要ありません。

于 2012-11-15T12:20:29.050 に答える
1

探しているのは1対多のテーブルですが、ツイストは、ブラックリストに載っているユーザーの詳細を取得するために、元のテーブルへの参照を持っていることです。したがって、ユーザーテーブルは次のようになり、AppUserIDがユーザーを一意に識別するPKになります。

CREATE TABLE [dbo].[AppUser](
    [AppUserID] [bigint] IDENTITY(1,1) NOT NULL,  -- Pk for the user
    [UserName] [nvarchar](50) NOT NULL,
    [FirstName] [nvarchar](50) NOT NULL,
    [LastName] [nvarchar](50) NOT NULL,
    [EmailAddress] [nvarchar](255) NULL,
 CONSTRAINT [PK_APP_USER] PRIMARY KEY CLUSTERED ( [AppUserID] ASC)
) 
GO

ブラックリストテーブルには、特定のAppUserIdのブラックリストに登録されたユーザーが0,1、n..含まれます。AppUserBlacklistIDは、現在のユーザーの特定のブラックリストに登録されたユーザーを一意に参照するために必要です。それらを削除または更新する必要がある場合に備えて。したがって、AppUserBlackListIdを使用します

CREATE TABLE [dbo].[AppUserBlackList](
    [AppUserBlackListID] [bigint] IDENTITY(1,1) NOT NULL,
    [AppUserID] [bigint] NOT NULL,                      -- Foreign Key to the AppUser table to identify the users black listed 'Users'
    [BlackListedAppUserID] [bigint] NOT NULL,           -- Foreign Key to the AppUser table to identify the user that is black listed
    [Reason] [nvarchar](255) NOT NULL,
 CONSTRAINT [PK_APP_ROLE] PRIMARY KEY CLUSTERED (AppUserBlackListID ASC)
) ON [PRIMARY]

次に、いくつかの外部キー制約を作成します

-- Foreign key to the users table. This is used to list all the black listed users for a particular user
ALTER TABLE [dbo].[AppUserBlackList]  WITH CHECK ADD  CONSTRAINT [FK_AppUserBlackList.AppUserID_AppUser] FOREIGN KEY([AppUserID])
REFERENCES [dbo].[AppUser] ([AppUserID])

-- This is a Foreign Key to the App user for the user that is black listed. It should also be unique in that one user can only blacklist another
-- User one time. 
ALTER TABLE [dbo].[AppUserBlackList]  WITH CHECK 
    ADD  CONSTRAINT [FK_AppUserBlackList.BlackListedAppUserID_AppUser] FOREIGN KEY([BlackListedAppUserID])
        REFERENCES [dbo].[AppUser] ([AppUserID])

これで、設計を非常に厳しくするために、ユーザーが人を2回以上ブラックリストに登録できないこと、およびユーザーが自分自身をブラックリストに登録できないことを示すために、固有の制約を設定できます。

特定のユーザーのすべてのブラックリストに登録されたユーザーを取得するには..2つのテーブルを結合します

Select AppUserBlackListID, AppUserID,BlackListedUserName
  from 
     AppUser auCurrentUser 
      Inner join AppUserBlackList auBl 
          on auCurrentUser.AppUserId = auBl.AppuserID 
      Inner join AppUser auBlackListedUserDetails 
          on auBL.BlackListedAppUserID =auBlackListedUserDetails.AppUserID
Where au.AppUserId = 10

したがって、ブラックリストに登録されたユーザーの詳細を取得するには、ユーザーテーブルに再度参加する必要があります

お役に立てれば

于 2012-11-15T12:41:12.557 に答える
0

多対多の関係が必要な場合があります。1人の人が他の複数の人をブラックリストに登録できるためです。また、1人のユーザーが他の複数のユーザーによってブラックリストに登録される可能性があります。

多対多を実装するには、次のように2つの列(ブラックリスター用の1つの列とブラックリスト用の次の列)を持つ個別のテーブルがあります。

1 2 // person 1 blacklists person 2
1 3 // person 1 also blacklists person 3
3 2 // person 2 is also blacklisted by person 3, as well as by person 1

1対多の場合(1人が他の複数の人をブラックリストに登録でき、各人が複数の人にブラックリストに登録されることはありません)

于 2012-11-15T12:14:57.973 に答える