存储关注者和跟踪MySQL的最佳方式

时间:2017-07-08 17:28:33

标签: php mysql arrays

我有两个表,一个是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 个答案:

答案 0 :(得分:0)

最简单的解决方案是使用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

请注意,将“initiator”存储为字符串不是一个好主意 - 它可能应该是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'

答案 1 :(得分:0)

您有表格UserCompany。我们假设它们包含以下列:

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

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

然后你应该创建一个many-to-many table - 例如让我们称之为UserCompany - 其中包含至少列{{ 1}}和UserId(来自前两个表)。

让我们假设爱丽丝跟随微软和苹果,而鲍勃跟随谷歌。您的新CompanyId表将包含以下数据:

UserCompany
  

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

此处您是获取跟随Microsoft的用户数据的查询:

UserId CompanyId
------ ---------
1      1
1      2
2      3
  

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

在这里,您可以查询Alice公司的数据:

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