创建一对多关系

时间:2012-11-15 12:07:06

标签: mysql

我在stackoverflow中搜索了很多关于这个问题的内容..和我一样的问题,但没有解决我的问题。 我创建了一个用户在其中的表..列是这样的东西

uid 
username
name
family
....

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

uid = 1
blacklistid = 3

uid = 1
blacklist equal 4

然后在这种情况下,我没有任何主键,我认为这是错误的。如果我在自动启动模式中插入一个主键,我将有一个非常大的int,为什么我需要这个主键?出于什么原因?我有人告诉我,他告诉我你的设计可能有问题

然后我需要知道如何设计这个案例?

3 个答案:

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

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