我在stackoverflow中搜索了很多关于这个问题的内容..和我一样的问题,但没有解决我的问题。 我创建了一个用户在其中的表..列是这样的东西
uid
username
name
family
....
现在我需要创建一个黑名单,它将存储被列入黑名单的人的用户ID。我不知道如何创建这个表,因为每个人可以有很多黑名单的人然后黑名单表是这样的事情
uid = 1
blacklistid = 3
uid = 1
blacklist equal 4
然后在这种情况下,我没有任何主键,我认为这是错误的。如果我在自动启动模式中插入一个主键,我将有一个非常大的int,为什么我需要这个主键?出于什么原因?我有人告诉我,他告诉我你的设计可能有问题
然后我需要知道如何设计这个案例?
答案 0 :(得分:2)
黑名单表中的主键是用户ID和列入黑名单的ID的组合。
User
id
name
...
Blacklist
user_id
target_id
user_id和target_id的组合应该是唯一的。
不需要自动递增的id字段。
答案 1 :(得分: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个表格
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
因此,您需要加入用户表以获取列入黑名单的用户详细信息
希望这有帮助
答案 2 :(得分: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
如果它只是一对多(一个人可以将其他几个人列入黑名单;并且每个人都不能被多个其他人列入黑名单)