具有大量单个选项的多个用户的Mysql设置

时间:2012-06-26 19:28:24

标签: mysql database-design

我正在构建一个学习工具,我不确定构建数据库的最佳方法。

基本上,我有一个简单但很大的表,其中包含大约50000位信息。

info(50'000行)

ID INFO_TEXT

用户

ID 名称 电子邮件 密码 等

我想要的是让学生能够将每个项目标记为已学习或被研究(基本上是开关),以便他们可以在修改每个项目时勾选它们。

我想构建工具来应对成千上万的用户,并且想知道设置数据库和相关查询的最有效/最简单的选择方法是什么。

此刻,我倾向于只有一个带有两个主键的巨大表,一个用户ID,然后是他们研究过的信息的id,然后做一些JOIN语句,所以我只能撤回他们的项目离开学习。

USER_INFO

USER_ID info_id

提前致谢

2 个答案:

答案 0 :(得分:0)

我会做这样的事情:

1)具有uid主键的用户表

2)注册表(此表显示已注册学生的所有课程),主键为(uid,cid)

3)一个项目(信息)表,包含要学习的所有项目,主键为itemid

然后在登记表中只有一个属性(二进制标志)1意味着它已被研究,0意味着他们仍然需要研究它。

答案 1 :(得分:0)

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

enter image description here

中间的表在USER_ID和ITEM_ID上有一个复合主键,因此两者中的组合必须是唯一的,即使它们不必单独存在。

  • 只有在STUDIED表中有相应的行(具有相同的USER_ID和ITEM_ID值)时,用户(具有给定的USER_ID)才会研究特定项目(具有给定的ITEM_ID)。
  • 相反,当且仅当缺少STUDIED中的相应行时,用户才研究该项目。要拉出给定用户尚未研究的所有项目,您可以执行以下操作:

    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
    

这个设计的好处是你不需要提前关心STUDIED表。添加新用户或项目时,只需单独留下STUDIED - 随着用户的学习进度,您将逐渐填写它。