针对多个用户的Mysql设置,具有大量单独选项

针对多个用户的Mysql设置,具有大量单独选项,mysql,database-design,Mysql,Database Design,我正在构建一个研究工具,但我不确定构建数据库的最佳方式 基本上,我有一个简单但很大的表,里面有大约50000位的信息 信息50000行 身份证 信息文本 使用者 身份证 名称 电子邮件 暗语 等 我想让学生们能够将每一个项目标记为已学习或被学习,这样他们就可以在修改后勾掉每一个项目 我想建立一个工具来处理成千上万的用户,我想知道建立数据库和相关查询的最有效/最简单的方法是什么 目前,我倾向于只拥有一个巨大的表,表中有两个主键,一个是用户id,然后是他们研究过的信息id,然后执行某种JOIN语句,

我正在构建一个研究工具,但我不确定构建数据库的最佳方式

基本上,我有一个简单但很大的表,里面有大约50000位的信息

信息50000行

身份证 信息文本

使用者

身份证 名称 电子邮件 暗语 等

我想让学生们能够将每一个项目标记为已学习或被学习,这样他们就可以在修改后勾掉每一个项目

我想建立一个工具来处理成千上万的用户,我想知道建立数据库和相关查询的最有效/最简单的方法是什么

目前,我倾向于只拥有一个巨大的表,表中有两个主键,一个是用户id,然后是他们研究过的信息id,然后执行某种JOIN语句,这样我就只能收回他们留下来研究的项目

用户信息

用户id 信息标识


提前谢谢

我会这样做:

SELECT * FROM ITEM
WHERE NOT EXISTS (
    SELECT * FROM STUDIED
    WHERE
        USER_ID = <given_user_id>
        AND ITEM.ITEM_ID = STUDIED.ITEM_ID
)
1具有uid主键的用户表

2注册表此表显示了所有注册学生主键为uid、cid的课程

3包含所有要研究的项目的项目信息表,主键为itemid


然后,在已注册的表中,只有一个属性,二进制标志1表示已对其进行了研究,0表示仍需要对其进行研究

以下是模拟这种情况的一种方法:

中间的表在UsRyID和ItMySID上有一个复合主键,所以两者的组合必须是唯一的,即使它们不必是单独的。

只有当所研究的表中存在具有相同用户ID和项目ID值的对应行时,具有给定用户ID的用户才研究了具有给定项目ID的特定项目。 相反,当且仅当“已研究”中的对应行缺失时,用户尚未研究该项。要提取给定用户尚未学习的所有项目,可以执行以下操作:

SELECT * FROM ITEM
WHERE NOT EXISTS (
    SELECT * FROM STUDIED
    WHERE
        USER_ID = <given_user_id>
        AND ITEM.ITEM_ID = STUDIED.ITEM_ID
)
或者,或者:

SELECT ITEM.*
FROM ITEM LEFT JOIN STUDIED ON ITEM.ITEM_ID = STUDIED.ITEM_ID
WHERE USER_ID = <given_user_id> AND STUDIED.ITEM_ID IS NULL

这种设计的好处是,您不需要提前关注已研究的表。在添加新用户或项目时,只需将已学习的内容放在一边,随着用户学习的进展,您将逐渐填充该内容。

但这不仅仅是一门课程的开启和关闭。我需要它,这样他们就可以为50000条信息中的每一条都设置一个二进制标志。感谢您的时间。您是否有多个用户共享的项目组,或者所研究的项目在用户之间是否存在差异,以至于没有必要将它们分组在一起?嘿,布兰科,谢谢您的回复。我不确定我是否明白你的意思,但基本上这是一个简单的句子列表,供每个学生学习,按重要性排序。列表是固定的,不会因用户而异。唯一需要的关系是每个项目,或者每个学生有50000个项目需要学习或不需要学习。所以,所有学生总是学习所有项目?嗨,布兰科,谢谢你的回答。这就是我一直在考虑的解决方案。我担心被研究的桌子会很快变得很大。这会严重影响性能,还是MYSQL可以处理好呢。@之前的一切都是。。。是的,它会变得很大,但数据库是为高效处理大量数据而建立的。记住,没有魔法。每一条信息都需要以某种方式进行物理存储,这几乎是最紧凑的关系存储方式。索引应该确保良好的性能,即使在数十亿行上也是如此。有一些非关系黑客可能会为您节省一些空间,但会损害数据完整性,可能还会影响性能,因此我强烈建议不要使用它们。