-1

我在stackoverflow中搜索了很多关于这个问题的信息。有和我一样的问题,但没有解决我的问题。我创建了一个包含用户的表。列是这样的

uid 
username
name
family
....

现在我需要创建一个黑名单,它将存储被列入黑名单的人的用户 ID。我不知道如何创建这个表,因为每个人都可以有很多被列入黑名单的人,那么黑名单表就是这样的

uid = 1
blacklistid = 3

uid = 1
blacklist equal 4

那么在这种情况下,我没有任何主键,我认为这是错误的。如果我在自动增量模式下插入主键,我将有一个非常大的 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

好的,您正在寻找的是一个一对多的表格,但扭曲的是您可以参考原始表格,以获取黑名单用户的详细信息。因此,您的用户表看起来像这样,其中 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

您的黑名单表将有 0,1,n.. 特定 AppUserId 的黑名单用户。您需要 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 个表

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 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

如果只是一对多(一个人可以将其他几个人列入黑名单;每个人不能被多个人列入黑名单)

于 2012-11-15T12:14:57.973 回答