不想在数据库中的两个字段/表中保留相同的记录

时间:2012-02-05 14:43:14

标签: c# asp.net .net sql database-design

我有以下情景

我有新闻网络应用程序 我有两张桌子

1- 用户(向新闻网站注册用户)

2- 评论表和评论表中有以下一些字段

   Comments(Comments against any news)
   userID (which user comment on agaist this news) // it is foreign key
   NewsID
   UserName(same as userID which user comment on agaist this news) varchar // this field using for non register users

场景1:     如果注册用户评论,那么我插入评论与newsid和userid 在comments表中,UserName在这种情况下为null

场景2:     如果非注册用户(或者你可以说客人)对新闻发表评论,那么我使用的是UserName,而不是userID,UserID在这种情况下为空

我不想保留两个地方的用户记录,一个在用户表中,第二个用于 注释表的UserName字段中的非注册用户scenaro 你的建议

3 个答案:

答案 0 :(得分:1)

您可以制作未注册的用户并将其放在“用户”表中,并将其与Cookie相关联,以便他们继续使用相同的信息。我认为这可能类似于StackOverflow处理匿名用户的方式。

我不认为你的设计存在很大问题。在表上加上一个约束,使两者中只有一个为NULL,并在检索中使用COALESCE在结果集中获取单个用户名:

SELECT COALESCE(User.UserName, Comment.UserName) AS UserName --, etc.
FROM Comment
LEFT JOIN User
    ON User.UserID = Comment.UserID

答案 1 :(得分:0)

您可以将另一张桌子与其他桌子放在一起

  • guests包含usernameuserid字段

  • users,其中包含userid字段和其他字段。

然后,您可以使用上面的2个用户ID列交叉引用您的comments用户ID列,以获取用户名和其他信息,这样您就无需username列{ {1}}

答案 2 :(得分:0)

留在评论表中的这两个字段。在“用户”表中创建匿名用户并始终填充这两个文件 对于匿名用户:
userId =用户表中该单个匿名用户的Id UserName =匿名用户名

对于注册用户,在UserName字段中将是来自Users表的重复值
这会在显示新闻评论时带来性能优势,因为您总是(我猜)需要在评论旁边显示UserName,但不需要立即更多用户的详细信息,因此无需在查询中加入用户故事评价。