设计数据库的最佳方式是为每个用户提供不确定数量的字段?

时间:2012-03-25 02:48:36

标签: sql database-design data-structures

我正在尝试了解如何设计一个可以容纳每个用户不确定数量的字段的数据库。

例如,User1参与项目A,B和C.用户2参与项目A,C,E和G,而用户3参与项目A,B,C,D,E,F和G. / p>

一个表中包含用户列表的用户,然后还有7个列来记录他们所参与的项目,这将很好地服务......直到我必须容纳最终涉及100个项目的User4,在我的项目中模型,需要100列才能跟踪。

最终无法预先知道要定义多少列。

我可以将它翻转并关联User1&用户3与项目B,但随后进一步在路上,在有10,000个项目之后,我必须查看每个项目记录以生成给定用户参与的项目的完整列表,这看起来非常低效。

那么...如何跟踪?只是不能完全围绕这一个。

总是新手,所以请原谅我,如果这个说得不好或非常基本。

谢谢,

2 个答案:

答案 0 :(得分:4)

听起来你可能试图将这两个实体(userproject)混合到一个表中,这真的不是最好的方法。

另一种方法是将您的用户信息放在user表中,将项目信息放在project表中,将另一个“链接”表放在user_projects中,它只包含userproject表中的ID字段,每个项目中每个用户的一个条目。

示例架构:

user (userID, firstName, lastName)

project (projectID, projectTitle)

user_projects (userID, projectID)

要为用户3选择项目标题,您可以执行以下操作:

SELECT p.projectTitle 
FROM project p INNER JOIN user_projects up ON p.projectID = up.projectID
WHERE up.userID = 3

user_projects表的目的是链接userproject表中包含的信息,这就是全部。

答案 1 :(得分:3)

典型的多对多关系。

您需要创建一个表格,其中每个条目都是关系:user_idproject_id。 如果某个用户(id = uid)涉及项目(id = pid),那么只有那个表中有一对(记录有2列):user_id,{ {1}}。

是的,对于从未见过这种情况的人来说,这可能听起来很奇怪,但这就是它在任何地方都是如此,并且DB可以处理这些表的处理速度。

如果您稍后决定,每个用户都应该在项目中有一些角色,您就可以在该表中添加其他字段。