我有两个表,一个是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的工作级别。
答案 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)
您有表格User
和Company
。我们假设它们包含以下列:
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