【问题标题】:Best Way To Design Database to Accommodate Indeterminate Number of Fields Per User?设计数据库以容纳每个用户不确定数量的字段的最佳方法?
【发布时间】:2012-03-25 11:20:33
【问题描述】:

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

例如,用户 1 参与项目 A、B 和 C。用户 2 参与项目 A、C、E 和 G,而用户 3 参与项目 A、B、C、D、E、F 和 G。

在行中列出用户的表格,然后再添加 7 列来记录他们参与的项目,这将非常有用......直到我不得不容纳最终参与 100 个项目的用户 4,在我的模型,需要 100 列来跟踪。

最终将无法提前知道要定义多少列。

我可以翻转它并将用户 1 和用户 3 与项目 B 相关联,但再往前走,在有 10,000 个项目之后,我必须查看每个项目记录以生成一个完整的项目列表鉴于用户已参与其中,这似乎非常低效。

那么...如何跟踪?只是无法完全理解这个。

我完全是新手,所以如果说得不好或非常初级,请原谅我。

谢谢,

【问题讨论】:

    标签: sql database-design data-structures


    【解决方案1】:

    听起来您可能正在尝试将这两个实体(userproject)混合到一个表中,这确实不是最好的方法。

    另一种方法是将您的用户信息放在user 表中,将项目信息放在project 表中,以及另一个“链接”表(如user_projects)中,其中仅包含来自@987654326 的ID 字段@ 和 project 表,每个项目中的每个用户都有一个条目。

    示例架构:

    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 表中包含的信息,仅此而已。

    【讨论】:

    • 啊,是的。项目限制为 20 个贡献者,因此 ProjID 为行,然后为 20 列(潜在)贡献者用户 ID。这是否意味着我已辞职以选择 ProjID WHERE column_1=UserID OR column_2=UserID OR... column_20=UserID?或者我可以更有效地完成这部分吗?
    • 非常感谢您在这里所做的努力,kaveman。在我完全理解之前,我将不得不尝试它,但是让我重新陈述我的理解&如果你读到这个,你告诉我是否明白:当一个用户为一个项目做出贡献时,一个新的行包含ProjID & UserID 被添加到 user_projects 表中。然后我可以很容易地获得 ProjID 的任何用户 ID 也存在的问题。这似乎很容易说出来。说得通?再次感谢...
    • @Benjamin - 欢迎您。听起来你现在有正确的想法。如果其中一个答案对您有帮助,请考虑将其标记为“已接受”...这将帮助可能有类似问题的其他人,并提高您将来提出的问题受到关注的可能性
    【解决方案2】:

    典型的多对多关系。

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

    是的,这对于从未见过的人来说可能听起来很奇怪,但这就是它的制作方式,而且 DB 对此类表的处理速度还可以。

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

    【讨论】:

    • 这有帮助。我没有意识到我正在寻找“多对多”术语。快速的谷歌搜索表明这可能正是我想要剥皮的猫。谢谢。
    猜你喜欢
    • 2014-06-24
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    相关资源
    最近更新 更多