【问题标题】:confusion over relationships关系混乱
【发布时间】:2011-07-26 23:30:06
【问题描述】:

嘿,伙计们,我有一个令人困惑的问题,我有一个用户表,它存储了您所期望的用户的所有常用数据,但我试图弄清楚用户如何添加另一个用户?

听起来很奇怪,但是 User 表中的每个用户都有自己的 UI,即 UserID 我如何添加另一个表,其中 UserID 可以与另一个 UserID 有关系?

我将为那些可能需要时间上传表格图的人提供答案,谁可以帮助提供与此问题相关的一些 sqlsyntax 示例,即如果我想显示,我将如何纠正上述问题的语法页面上的所有 UserIDs 朋友。怎么加好友。

【问题讨论】:

    标签: c# asp.net mysql sql html


    【解决方案1】:

    您只需要另一个类似于图片和墙贴表的表。您只需要能够为一个用户 ID 记录多个朋友 ID(一对多)

    例如:

    然后得到朋友的查询是:

    DECLARE @UserID AS BIGINT
    
    SET @UserID = 123
    
    SELECT [friends].*
    FROM [friends]
    where [parentuserid]=@UserID#
    

    插入朋友:

    DECLARE @UserID AS BIGINT
    DECLARE @FriendID AS BIGINT
    
    SET @UserID = 123
    SET @FriendID = 321
    
    INSERT INTO [Friends]
    (
        [ParentUserID],
        [ChildUserID]
    )
    VALUES
    (
        @UserID,
        @FriendID
    )
    

    插入代码示例:

    private void Test()
    {
        string Query =
            @"INSERT INTO [Friends]
              (
                [ParentUserID],
                [ChildUserID]
              )
              VALUES
              (
                @UserID,
                @FriendID
              )";
    
        using ( SqlConnection oSqlConnection = new SqlConnection( "connect string" ) )
        {
            oSqlConnection.Open();
    
            using (SqlCommand oSqlCommand = new SqlCommand(Query,oSqlConnection))
            {
                oSqlCommand.Parameters.AddWithValue("@UserID", Session["UserID"]);
                oSqlCommand.Parameters.AddWithValue("@FriendID", Session["FriendID"]);
    
                oSqlCommand.ExecuteNonQuery();
            }
        }
    }
    

    你会从哪里得到你的朋友 ID?添加好友的流程是什么?您会搜索它们并从列表中选择它们吗?

    【讨论】:

    • FriendID的需求吗?
    • 所以 ParentUserID 是当前用户 ID,childuserid 是您添加的人员用户 ID?
    • @Chris - 不,但我的桌子上总是有一个主键。
    • @WraithNath 主键将是复合 (ParentUserID, ChildUserID),如果确实如此,它将强制您不能成为两次朋友。
    • 我会假设从您登录的那一刻起,当前用户 ID 始终在会话中。如果您随后有一个搜索用户的页面,那么您可以调用该方法来插入朋友记录将选定的用户 ID 传递给它。或者将选定的 UserID 存储在会话中,然后调用从会话中读取它的方法。这实际上取决于您的网站的工作方式,您可以拥有它,因此单击系统中的任何其他用户会将friendID存储在会话中,以便您可以调用该方法。多种可能性!
    【解决方案2】:

    我认为您有一个简单的要求,即用户推荐其他用户加入。如果是这种情况,那么您可以简单地在User 表中再添加一列ReferenceUserID,每当新用户引用另一个用户时,只需将他添加到引用用户的UserID。如果他不是推荐用户,则默认为NULL

    稍后您可以使用 Self Join 进行检索。

    更新:

    对于朋友(多对多关系),您应该查看 StackOverflow 上的以下问题

    Database design: Best table structure for capturing the User/Friend relationship?

    UserRelationship
    ====
    RelatingUserID
    RelatedUserID
    Type[friend, block, etc]
    

    Facebook 使用了类似的方法,他们有一种交叉连接表来处理朋友之间的关系。

    【讨论】:

    • 我认为他希望能够添加朋友,而不仅仅是存储用户将他们推荐到网站的内容。但这并不完全清楚。你建议的是一对一的关系,我认为他需要多对多的关系。
    • OP 的问题并不清楚......还有许多其他答案解释了另一个方面(m2m rel)所以我没有包括在内。
    【解决方案3】:

    你对图表等的要求有点多……至少对我来说。

    这取决于关系的类型,一对一,它将是您用户表中的另一列。如果是多对多,则需要一个联结表,其中包含两列 UserIDA、UserIDB。取决于你为什么需要这种关系。

    【讨论】:

      【解决方案4】:

      你只需要一个多对多的关系。

      Create Table Friend(
        UserId int,
        FriendId int,
        Constraint pk_friends Primary Key (UserId, FriendId),
        Constraint fk_friend_user Foreign Key (UserId) References User(UserId),
        Constraint fk_friend_friend Foreign Key (FriendId) References User(UserId)
      )
      

      【讨论】:

      • +1 这将需要您做出一些进一步的选择,您是否在每个友谊userA, userBuserB, userA 中插入两行以简化加入或在加入逻辑中包含谓词以进行无论哪种方式,单张唱片都可以工作。另外,如果选择第一个选项是友谊自动 2 方式?
      • @Robb - 好点。这就像推特一样,您可以关注但其他人不需要关注吗?还是这种关系更像 Facebook,您确认您实际上是朋友并且双方都知道这种关系?不确定它是否会改变我的答案,但它确实会影响您处理数据的方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多