【问题标题】:Optimal way to store follower and following MySQL存储追随者和追随 MySQL 的最佳方式
【发布时间】:2017-07-08 17:28:32
【问题描述】:

我有两张桌子,一张是user,另一张是company。两者都有以下共同的列,而其他列则不同。

id   email                name   
1    first@email.com      First user
2    second@email.com     Second User
3    third@email.com      Third User

现在一个用户可以关注很多公司,但一个公司不能关注用户。公司应该拥有关注他们的用户的数据,并且用户还应该存储他们关注的公司。

在 MySQL 上实现这一点最简单和最佳的方法是什么?我应该为它创建单独的表,或者只是在现有表上添加一个包含关注者数组的列。假设我对 PHP 和 MySQL 有一定的了解,请回答。

【问题讨论】:

  • 绝对不是选项2!!如果你有 mysql 的工作知识,你不会认为这是可能的!

标签: php mysql arrays


【解决方案1】:

您有表 UserCompany。假设它们包含这些值:

User

UserId UserName UserMail
1 Alice alice@mail.com
2 Bob bob@mail.com

Company

CompanyId CompanyName CompanyAddress
1 Microsoft Redmond
2 Apple Cupertino
3 Google Mountain View

那么你应该创建一个many-to-many table - 例如我们称之为UserCompany - 它包含至少UserIdCompanyId(来自前两个表)。

假设 Alice 关注 Microsoft 和 Apple,Bob 关注 Google。您的新 UserCompany 表将包含以下数据:

UserId CompanyId
1 1
1 2
2 3

公司应该有关注他们的用户的数据

这里是获取关注微软用户数据的查询:

SELECT u.UserName, u.UserMail
FROM User AS u
JOIN UserCompany AS uc ON u.UserId = uc.UserId
WHERE uc.CompanyId = 1

用户还应该有他们关注的公司的数据。

这里是获取 Alice 所关注公司数据的查询:

SELECT c.CompanyName, c.CompanyCity
FROM UserCompany AS uc
JOIN Company AS c ON c.CompanyId = uc.CompanyId
WHERE uc.UserId = 1

【讨论】:

    【解决方案2】:

    最简单的解决方案是使用一个 MANY-TO-MANY 连接表来链接这两个表。您可以使用 2 个 MANY-TO-MANY 表或单个表来执行此操作。

    例如2个表:

    user_follows_company

    ID    CompanyID UserID
    ----  ------ ---------
    1     1      5
    1     1      6
    1     1      8
    1     2      5
    

    您可以使用以下 SQL 获取用户关注的公司:

    SELECT * FROM company c JOIN user_follows_company ufc on ufc.companyID = c.ID WHERE user = $USER_ID

    company_follows_user

    ID    CompanyID UserID
    ----  --------- ---------
    1     3         5
    1     3         6
    1     5         3
    1     5         4
    

    您可以使用以下 SQL 获取公司关注的用户:

    SELECT * FROM user u JOIN company_follow_user cfu on cfu.userID = u.ID WHERE user = $USER_ID

    或者您可以使用单个表格执行此操作,并使用一列来指定要遵循的方向:

    follows_table

    ID    CompanyID UserID     Initiator
    ----  --------- ---------  ---------
    1     3         5          Company
    1     3         6          Company
    1     5         3          Company
    1     5         4          Company
    1     5         1          User
    1     6         1          User
    1     8         1          User
    1     5         2          User
    

    请注意,将“启动器”存储为字符串不是一个好主意 - 它可能应该是 int 或 ENUM

    要查询此表,请执行以下查询:

    用户关注的公司: SELECT * FROM company c JOIN follows_table ft on ft.userID = c.ID WHERE user = $USER_ID AND ft.initiator = 'user'

    公司关注的用户: SELECT * FROM user u JOIN follows_table ft on ft.userID = u.ID WHERE companyID = $$COMPANY_ID AND ft.initiator = 'company'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 2021-10-09
      • 2019-07-03
      • 1970-01-01
      • 2020-05-14
      • 2021-11-25
      • 2017-12-08
      相关资源
      最近更新 更多