0

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

基本上,我有一张简单但大的桌子,里面有大约 50000 位信息。

信息(50'000 行)

id info_text

用户

身份证姓名电子邮件密码等

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

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

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

用户信息

user_id info_id

提前致谢

4

2 回答 2

0

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

在此处输入图像描述

中间的表在 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 放在一边 - 随着用户学习的进展,您将逐渐填充它。

于 2012-06-26T20:13:30.763 回答
0

我会做这样的事情:

1) 带有 uid 主键的 users 表

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

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

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

于 2012-06-26T19:35:12.947 回答